4

我对析构函数有一个理解问题。

在以下示例中:

#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 的析构函数。

有人可以解释一下吗?

4

2 回答 2

5

在您的情况下,只有一个对象被销毁 - 即X(2)您分配右侧的临时对象。原始X(1)文件不会被破坏,因为它会被分配覆盖。当它被销毁的时候,它也会被打印出来destroying 2

但是,修改后的X(2)(以 开头X(1))通过无限循环保持活动状态,因此它也不会被破坏。删除无限循环可以解决此问题(演示)。

于 2013-07-12T10:06:53.917 回答
2

a = X(2); => 表达式调用赋值运算符和a.id 数据成员由temporaryobject.id 即2 初始化。

a = X(2); => 表达式调用编译器提供的默认赋值运算符并进行蜡样复制。

X(2) 表达式创建临时对象,temporaryobject.id 初始化为 2。

当临时对象被另一个对象调用时,第一次解构 get 调用。

于 2013-07-12T10:27:15.880 回答