gpt4 book ai didi

c++ - 不可重载的 C++ 运算符

转载 作者:可可西里 更新时间:2023-11-01 16:52:22 26 4
gpt4 key购买 nike

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

最佳答案

我很确定 C++ FAQ Lite 可能涵盖了这一点。我马上能想到的是三元运算符、. 运算符和范围解析运算符 (::)。想一想,由于 . 运算符不能重载,.* 可能也不能重载。

还有一些运算符可以但几乎永远不应该重载,包括逗号运算符、&&||,所有这些通常都会创建一个序列点。 &&|| 也仅(通常)在必要时评估正确的操作数。这些特征都不适用于重载运算符。

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

编辑:至于只在必要时评估正确的操作数(又名“短路评估”):考虑像 x && y 这样的东西。只有当左操作数为真时,表达式才能为真。如果左操作数的计算结果为 false,则表达式也必须为 false,并且 C(和 C++)保证不会对右操作数进行计算。如果您想执行类似 if (ptr != NULL && ptr->member/*...*/) 的操作,这很方便(例如)。在这种情况下,如果指针为 NULL,执行将停止,并且您永远不会尝试取消引用指针。

|| 的基本思想相同,但相反。在这种情况下,如果左操作数的计算结果为 true,则表达式作为一个整体必须为 true,无论右操作数的计算结果如何(再次)C和 C++ 保证在这种情况下不会计算正确的操作数。

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

关于c++ - 不可重载的 C++ 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2874589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com