我对析构函数有一个理解问题。
在以下示例中:
#include <iostream>
using namespace std;
class X{
public:
int id;
X(int id){
this->id = id;
}
~X(){
cout << "destroying " << id;
}
};
int main(){
X a(1);
a = X(2);
while(true);
return 0;
}
我得到以下输出:销毁2
这对我来说完全出乎意料,因为我认为当对象停止存在时,析构函数总是被调用。
但是在这个例子中,它的对象1停止存在并被对象2替换。但是不是调用对象1的析构函数,而是调用对象2的析构函数。
有人可以解释一下吗?
答案 0 :(得分:5)
在您的情况下,只有一个对象被销毁 - 即,作业右侧的临时X(2)
。原始X(1)
不会被销毁,因为它会被赋值覆盖。当它被摧毁的时候,它也将打印destroying 2
。
但是,修改后的X(2)
(以X(1)
开头)通过无限循环保持活动状态,因此它也不会被破坏。删除无限循环可修复此问题(demo)。
答案 1 :(得分:2)
a = X(2); =&GT;表达式调用赋值运算符和a.id数据成员由temporaryobject.id初始化,即2。
a = X(2); =&GT; expression调用编译器提供的默认赋值运算符并执行淡黄色副本。
X(2)表达式创建临时对象,而temporaryobject.id用2初始化。
当临时对象被另一个对象调用时,第一次解析get调用。