运算符重载

无法更改内置类型的运算符,只能为用户定义的类型重载运算符。也就是说,至少一个操作数必须是用户定义的类型。

以下运算符不能重载:

  • 成员访问或点运算符 .
  • 指向成员访问运算符 .*的指针
  • 范围解析运算符::
  • 三元条件运算符 ?:
  • dynamic_cast,static_cast,reinterpret_cast,const_cast,typeid,sizeof,alignof,和 noexcept
  • 预处理指令 # 和 ##,它们在任何类型信息可用之前执行。

有些运算符不应该 (99.98%的情况下)超载:

  • && 和||(相反,更喜欢使用隐式转换为 bool)
  • ,
  • 运算符地址(一元 &)

为什么?因为它们使另一个程序员可能永远不会想到的运算符超载,导致行为与预期不同。

例如,用户定义的这些运算符的 && 和||重载会丢失其短路评估并失去其特殊的排序属性(C++ 17) ,排序问题也适用于 , 运算符重载。