一、双目操作符的重载
1.计算类双目操作符
形如L#R的表达式会被编译器处理为形如L.operator#(R)的成员函数的调用,该函数的返回值即为表达式的值。
形如L#R的表达式也可以被编译器处理为形如::operator#(L,R)的全局函数的调用,该函数的返回值即为表达式的值。
2.赋值类双目操作符
表达式的值是一个左值,而且它就是左操作数本身。
左操作数不能是常量,右操作数可以是常量。
二、单目操作符的重载
1.计算类单目操作符
形如#O的表达式会被编译器处理为形如O.operator#()的成员函数的调用,该函数的返回值即为表达式的值。
形如#O的表达式也可以被编译器处理为形如::operator(O)的全局函数的调用,该函数的返回值即为表达式的值。
2.自增减单目操作符
1)前缀自增减:#O -> O.operator#() / ::operator# (O)
操作数不能是右值,返回值是操作数的引用。
2)后缀自增减:O# -> O.operator#(0) / ::operator# (O, 0)
操作数不能是右值,返回值是操作数自增减之前的副本。
三、其它操作符的重载
1.插入/提取操作符:<
四、操作符重载的限制
1.不是所有的操作符都能重载,下列操作符不能重载:
1)作用域限定操作符(::)
2)直接成员访问操作符(.)
3)直接成员指针解引用操作符(.*)
4)条件操作符(?:)
5)字节长度操作符(sizeof)
6)类型信息操作符(typeid)
2.如果一个操作符所有的操作数都是基本类型,则该操作符无法被重载。
int operator+ (int a, int b) { return a - b; }
int x = 1 + 1;
cout << x << endl; // 0
3.操作符重载不会改变编译器预定义的优先级。
class Integer { ... };
Integer const operator^ (Integer const& x, int y) {
Integer z (1);
for (int i = 0; i < y; ++i)
z.m_i *= x.m_i;
return z;
}
d = a + b ^ c; // d = (a + b) ^ c;
4.操作符重载无法改变操作数的个数。
double operator% (Integer const& opd) {
return opd.m_i / 100.0;
}
double x = 50%; // x : 0.5
5.无法通过操作符重载发明新的操作符。
Double const operator@ (Double const& a, Double const& b) {
return Double (sqrt (a.m_d * a.m_d + b.m_d * b.m_d));
}
Double c = 3.0 @ 4.0; // c : 5.0