Jer*_*fin 17
我很确定C++ FAQ Lite可能涵盖了这一点.我能想到的就是三元运算符,.
运算符和范围解析运算符(::
).想一想,既然.
操作员不能超载,.*
也许也不可能.
也有一些运营商可以,但几乎从来没有要过载,包括逗号操作符,&&
,||
,所有这些通常创建一个序列点.该&&
和||
也才(正常),如果有必要评估正确的操作.这些特征都不适用于重载运算符.
虽然有几个原因可以这样做,但是重载一元&
(地址)运算符通常也是一个非常糟糕的主意.对象的地址在很大程度上等同于它的身份,因此重载它可能会使其他一些事情相对困难.
编辑:只在必要时评估正确的操作数(又名"短路评估"):考虑类似的事情x && y
.如果左操作数为true,则表达式只能为true.如果左操作数的计算结果为false
,则表达式也一定是假的,和C(和C++)保证正确的操作将不会在所有评估.如果你想做类似的事情,这很方便(例如)if (ptr != NULL && ptr->member /*...*/ )
.在这种情况下,如果指针为NULL,则执行停止,并且您永远不会尝试取消引用指针.
同样的基本想法是正确的||
,但相反.在这种情况下,如果左操作数求值为true
,那么表达式作为一个整体必须是true
,无论右操作数将评估什么,所以(再次)C和C++保证在这种情况下不会评估右操作数.
但是,当您重载这些运算符时,评估表达式all将始终评估两个操作数.即使它是一个空指针,第一个表达式也会尝试取消引用指针,因此它会给出未定义的行为.
大多数都可以超载.唯一不能成为的C运营商.和?:(和sizeof,技术上是一个运营商).C++添加了一些自己的运算符,除了::和.*之外,其中大多数都可以重载.
所以
.
?:
::
.*
来自维基百科:
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)
归档时间: |
|
查看次数: |
846 次 |
最近记录: |