我很确定 C++ FAQ Lite 可能涵盖了这一点。我马上能想到的是三元运算符,.
运算符和范围解析运算符 (::
)。想了一会儿,自从.
运算符不能重载,.*
可能也不能。
还有一些运算符可以但几乎不应该重载,包括逗号运算符,&&
, ||
,所有这些通常都会创建一个序列点。这&&
and ||
如有必要,也仅(通常)评估正确的操作数。对于重载运算符来说,这两个特征都不成立。
虽然这样做有几个原因,但重载一元&
(地址)运算符通常也是一个非常糟糕的主意。对象的地址在很大程度上等同于它的身份,因此重载它可能会使许多其他事情变得相对困难。
编辑:至于仅在必要时评估正确的操作数(又名“短路评估”):考虑类似x && y
。仅当左操作数为 true 时,表达式才为 true。如果左操作数的计算结果为false
,那么表达式也必须为 false,并且 C(和 C++)保证正确的操作数将not完全被评价。如果您想做类似的事情,这很方便(例如)if (ptr != NULL && ptr->member /*...*/ )
。在这种情况下,如果指针为 NULL,执行就会停止,并且您永远不会尝试取消引用该指针。
相同的基本思想是正确的||
,但相反。在这种情况下,如果左操作数的计算结果为true
,那么整个表达式必须是true
,无论正确的操作数的计算结果是什么,C 和 C++ 保证在这种情况下不会计算正确的操作数。
但是,当您重载这些运算符时,计算表达式 all 将始终计算both操作数。第一个表达式将尝试取消引用指针,即使它是空指针,因此它会给出未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)