特殊情况:
- = () [ ] -> 不能重载为类的友元函数!!!(否则可能和C++的其他规则矛盾),只能使用成员函数形式进行重载。
2. 如果运算符的第一个操作数要求使用隐式类型转换,则必须为友元函数(成员函数方式的第一个参数是this指针)
注意:
同一个运算符重载, 不能同时使用两种方式来重载,会导致编译器不知道选择哪一个(二义性)
运算符重载的禁区和规则
1. 为了防止对标准类型进行运算符重载,
C++规定重载运算符的操作对象至少有一个不是标准类型,而是用户自定义的类型
比如不能重载 1+2
但是可以重载 cow + 2 和 2 + cow // cow是自定义的对象
2.不能改变原运算符的语法规则, 比如不能把双目运算符重载为单目运算
- 不能改变原运算符的优先级
- 不能创建新的运算符,比如 operator**就是非法的, operator*是可以的
- 不能对以下这四种运算符,使用友元函数进行重载
= 赋值运算符,()函数调用运算符,[ ]下标运算符,->通过指针访问类成员
6. 不能对禁止重载的运算符进行重载
不能被重载的运算符
成员访问 |
. |
域运算 |
:: |
内存长度运算 |
sizeof |
三目运算 |
? : : |
预处理 |
# |
可以被重载的运算符
双目运算符 |
+ - * / % |
关系运算符 |
== != < <= > >= |
逻辑运算符 |
&& || ! |
单目运算符 |
+(正号) -(负号) *(指针) &(取地址) ++ -- |
位运算 |
& | ~ ^ <<(左移) >>(右移) |
赋值运算符 |
= += -= *= /= %= &= |= ^= <<= >>= |
内存分配 |
new delete new[ ] delete[ ] |
其他 |
( ) 函数调用 -> 成员访问 , 逗号 |