C++运算符重载总结
1.双目运算符 : 操作数1 运算符 操作数2
算术运算符: +,-,*,/,%,后缀++,后缀--
位运算符: ^,&,|,<<,>>
赋值运算符: +=,-=,*=,/=,%=,^=,&=,|=,>>=,<<=
比较运算符: <,>,<=,>=,==,!=
逻辑运算符: &&,||
注意:后缀++,后缀--本来应该是单目运算符,
但是为了能够和前缀++,前缀--加以区别,
它也带了一个参数,这个参数必须为int类型。
例如如下代码:
#include<iostream> using namespace std; class A { public: //参数类型只能为int void operator ++(int a) { printf("%d\n",a); } }; int main() { A a; a++; //隐式调用参数值为0 a.operator++(25); //显式调用参数值为25 return 0; }
作为成员函数:
操作数1是对象本身 ,因此不能是静态成员函数
操作数2为成员函数的参数 ,因此必须有且只有一个参数
作为普通函数:
操作数1是参数1
操作数2是参数2
两个参数中至少有一个是类类型
2.单目运算符: 运算符 操作数
算术运算符: +,-,前缀++,前缀--
位运算符: ~
逻辑运算符: !
其他运算符: &,*
作为成员函数:
操作数是对象本身,因此不能为静态成员函数,且函数不能有参数
作为普通函数:
操作数就是参数,因此只能有一个参数,而且必须是类类型
3.特殊运算符:
1)只能作为普通成员函数重载 =,[],->,()
=,[]运算符
性质与上述双目运算符相同,只是不能作为普通函数。
->运算符
显示调用的时候与普通单目运算符相同。
但是当返回值不是对象指针的时候好像不能够隐式调用。
例如如下代码:
#include<iostream> using namespace std; class A { public: int operator ->() { printf("In A\n"); return 1; } int v; }; class B { public: A *operator->() { printf("In B\n"); return &a; } A a; }; int main() { A a; B b; //a->(); a->;不知道如何隐式调用 a.operator->(); b->v; return 0; }
()运算符
参数可以有0个或者任意个参数
2)只能作为静态成员函数或者普通函数重载new delete
作为成员函数时,无论加不加static都是静态成员函数
new
返回值必须为void *,第一个参数必须是size_t类型的,可以有任意多个参数
delete
返回值必须为void,第一个参数必须是void *,可以有任意多个参数
以上内容大部分为VS2010中实践得来,如有不正确的地方欢迎指正。