下面的 C++ 程序如何计算到“ACCA”?
显示的第一个字母是“A”。此输出与此行有关:
Base obj;
...您正在其中创建 Base 的新实例。
下一行有点复杂:
obj = obj+obj;
通常, this 被翻译成obj.operator+( obj )
,但你没有在 class 中重载 operator + Base
,所以这个翻译是无效的。剩下的可能性是运算符 + 实际上是数字加法运算符。
是的,这是可能的,因为您已经为int
. 因此可以将方程的每一项转换为int
... ,因此operator int
被调用两次。调用的实际次数operator int
取决于激活的优化。例如,编译器可以意识到这两个术语是相同的,然后operator int
在第一次调用时创建一个新的临时项。在这种情况下,您会看到 CA 而不是 CC。
最后,执行赋值表达式obj.operator=( temp )
。这里的关键字是temp。为了使默认值 operator=
起作用,因为它没有重载,所以你必须Base
在右边有一个对象。实际上有可能拥有它,因为Base
使用 anint
来构建新实例。好的,所以结果obj + obj
是一个int
(比如说它被称为“x”)数字,编译器创建了一个Base
用数字x构造的类的临时对象,因为执行了以下行:
Base temp( x );
这就是看到的最后一个字母是“A”的方式。同样,许多编译器可以避免在某些情况下构建临时变量,因此最后可能看不到“A”。
请注意,这一行:
obj = obj + obj
因此分解为:
int x = ( (int) obj ) + ( (int) obj );
Base temp( x );
obj = temp;
最后一条指令的结果是,obj
sits 所在的内存似乎将被以下内容占用temp
(这是默认复制构造函数的作用,它operator=
为类的每个成员执行,再次参见“三规则”)。
如您所见,如果您对语言没有或多或少的深入了解,则运算符重载涉及许多可能无法预见的问题。还要考虑到像 Java 这样的语言完全禁止使用它,而 C# 从受控的角度允许它使用。