不可重载的C++运算符

MKa*_*ann 8 c++ operator-overloading

哪些运算符不能在C++中重载?

Jer*_*fin 17

我很确定C++ FAQ Lite可能涵盖了这一点.我能想到的就是三元运算符,.运算符和范围解析运算符(::).想一想,既然.操作员不能超载,.*也许也不可能.

也有一些运营商可以,但几乎从来没有要过载,包括逗号操作符,&&,||,所有这些通常创建一个序列点.该&&||也才(正常),如果有必要评估正确的操作.这些特征都不适用于重载运算符.

虽然有几个原因可以这样做,但是重载一元&(地址)运算符通常也是一个非常糟糕的主意.对象的地址在很大程度上等同于它的身份,因此重载它可能会使其他一些事情相对困难.

编辑:只在必要时评估正确的操作数(又名"短路评估"):考虑类似的事情x && y.如果左操作数为true,则表达式只能为true.如果左操作数的计算结果为false,则表达式也一定是假的,和C(和C++)保证正确的操作将不会在所有评估.如果你想做类似的事情,这很方便(例如)if (ptr != NULL && ptr->member /*...*/ ).在这种情况下,如果指针为NULL,则执行停止,并且您永远不会尝试取消引用指针.

同样的基本想法是正确的||,但相反.在这种情况下,如果左操作数求值为true,那么表达式作为一个整体必须是true,无论右操作数将评估什么,所以(再次)C和C++保证在这种情况下不会评估右操作数.

但是,当您重载这些运算符时,评估表达式all将始终评估两个操作数.即使它是一个空指针,第一个表达式也会尝试取消引用指针,因此它会给出未定义的行为.


BCS*_*BCS 9

这篇关于运算符重载的文章

大多数都可以超载.唯一不能成为的C运营商.和?:(和sizeof,技术上是一个运营商).C++添加了一些自己的运算符,除了::和.*之外,其中大多数都可以重载.

所以

  • .
  • ?:
  • ::
  • .*


Jaa*_*ann 9

来自维基百科:

Operator Name                           Syntax
Bind pointer to member by reference     a.*b
Member                                  a.b
Scope resolution                        a::b
Size of                                 sizeof(a)
Ternary                                 a ? b : c
Type identification                     typeid(a)