不可重载的 C++ 运算符

2023-12-30

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


我很确定 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(使用前将#替换为@)

不可重载的 C++ 运算符 的相关文章

随机推荐