C++中运算符重载需要注意什么?
c++ - Operator overloading - Stack Overflow这篇FAQ讲的很清楚,把要点整理如下:
C++中operator重载的基本语意:
- 只能重载用户定义类型的operator。
- 以下operator不能重载:.,::,sizeof,?:
- 其余的都能重载,分别是:
- 算数运算符:二元:+ - / % += -= = /= %=,一元:+ - ++ –
- 位运算符:二元 & | ^ << >> and &= |= ^= <<= >>= ;一元 ~
- 布尔运算符:二元:== != < > <= >= || &&, 一元!
- 地址管理:new new[] delete delete[]
- 显示转换运算符
- 其它:二元:= [] ->,一元:* &,函数调用: ()
三个基本原则:
- 如果operator的含义模糊不清,就不要重载,用一个函数名清楚的函数替代
- 永远坚持operator众所周知的语意
- 永远提供相关的运算符重载,比如重载了+,就要重载+=
运算符实现成员还是非成员
- 赋值运算符=,数组下标运算符[],成员访问运算符->和函数调用运算符()必须是成员内的。
- 如果需要修改左操作数,通常实现在非成员,比如<<和>>。
- 对于别的,遵守下面的规则:
- 如果是一元运算符,成员
- 如果二元运算符,左右操作数对等,非成员
- 如果二元运算符,左右操作数不对等,成员