C++ c++;-调用了错误的析构函数

C++ c++;-调用了错误的析构函数,c++,destructor,C++,Destructor,我对析构函数的理解有问题 在以下示例中: #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

我对析构函数的理解有问题

在以下示例中:

#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;

}
#包括
使用名称空间std;
X类{
公众:
int-id;
X(整数id){
这个->id=id;
}
~X(){

cout在您的情况下,只有一个对象被销毁-即作业右侧的临时
X(2)
。原始
X(1)
不会被销毁,因为它会被作业覆盖。当它被销毁时,它也会打印
销毁2

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

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

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

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


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

a仅在main返回后停止存在,在此期间,它从未停止存在,您只能使用op=为它赋值。这是一个非常好的答案,但我只是在读了@Plasmah提到赋值运算符的注释后才理解它你也应该在你的回答中提到这一点;)因为首先,我认为(1)应该被销毁,然后它在内存中的空间应该被(2)的新副本填满。但事实上,(1)只是被修改以匹配(2)@VanCoding我说的是“赋值”两次,假设您知道它是一个运算符:)我知道,但是赋值可以得到不同的解释,正如您所看到的:D我认为内存是赋值的,而不是调用一个将(1)转换为(2)的函数