1、为什么要有运算符重载
对于基础类型运算符知道怎么计算,原因是编译器对于自定义类型不知道如何进行加减
所以编译器提供了一种机制,让用户自己去完成自定义类型的加减操作,这个机制就是运算符重载机制。其实该机制本身就是函数重写
C++怎么知道是编译器的+,-还是重载后的+,-呢?
编译器是通过类型来检测的。
运算符重载的语法形式:
1、运算符函数是一种特殊的成员函数或友员函数
2、成员函数的语法形式为:
类型 (函数返回类型) 类名(重载运算符类名) :: operator op ( 参数表 )
{
// 相对于该类定义的操作
}
一个运算符被重载后,原有意义没有失去,只是定义了相对一特定类的一个新运算符。
2、重载运算符的限制
可以重载的运算符
|
+ - * / % ^ & | ~ ! = < > += -= *= /= % ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* ‘ -> [] () new delete new[] delete[]
|
不能重载的运算符
|
. :: .* ?: sizeof
|
重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:
|
不改变运算符的优先级 不改变运算符的结合性 不改变运算符所需要的操作数 不能创建新的运算符
|
1、 用成员或友元函数两种方法重载运算符
-
运算符函数可以重载为类的成员函数或友员函数。
-
关键区别在于成员函数具有 this 指针,友员函数没有this指针
3、 不管是成员函数还是友员函数重载,运算符的使用方法相同。
-
传递参数的方式不同,实现代码不同,应用场合也不同
|
class test { public : test(int _a, int _b) { a = _a; b = _b; } void print() { cout << "a:" << a << "," << "b:" << b << endl; } //成员函数重载,this指针可以省略 test operator+(test&t2) { test tmp(a + t2.a, b + t2.b); return tmp; } //friend test operator+(test&t1, test&t2);//友元函数重载 protected: private: int a; int b; }; //test operator+(test&t1, test&t2) //{ // test tmp(t1.a + t2.a, t1.b+ t2.b); // return tmp; //} void main() { test t1(1,2); test t2(3, 4); test t3 = t1 + t2; t3.print(); system("pause"); } |
4、 一元运算符的重载:前置++,--,后置++,--
|
1、重载为成员函数,解释为: Object . operator op () 操作数由对象Object通过this指针隐含传递 2、重载为友员函数,解释为: operator op (Object) 操作数由参数表的参数Object提供 |
|
//通过成员函数完成前置-- Test & operator--() { this->a--; this->b--; return *this; } //通过成员函数完成前置-- Test & operator++() { this->a++; this->b++; return *this; }
//通过类成员函数完成后置-- Test operator--(int) { Complex tmp = *this; this->a--; this->b--; return tmp; } //通过类成员函数完成后置-- Test operator++(int) { Complex tmp = *this; this->a++; this->b++; return tmp;
|
5、 二元运算符的重载+,-,*,/
|
1、重载为成员函数,解释为: ObjectL . operator op ( ObjectR ) 左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递 2、重载为友员函数,解释为: operator op ( ObjectL, ObjectR ) 左右操作数都由参数传递
|
|
//通过类成员函数完成-操作符重载 Test operator-(Complex &c2) { Complex tmp(a - c2.a, this->b - c2.b); return tmp; } Test operator+(Complex &c2) { Complex tmp(a + c2.a, this->b + c2.b); return tmp; }
|

360

被折叠的 条评论
为什么被折叠?



