2011-10-23 46 views
0

即时覆盖对象时,试图理解构造函数和析构函数调用的顺序。C++ - 覆盖期间调用析构函数时的类成员

我的代码是:

class A 
{ 
public: 
    A(int n): x(n) 
    { cout << "A(int " << n << ") called" << endl; } 

    ~A() 
    { cout << "~A() with A::x = " << x << endl; } 

private: 
    int x; 
}; 

int main() 
{ 
    cout << "enter main\n"; 
    int x = 14; 
    A z(11); 
    z = A(x); 
    cout << "exit main" << endl; 
} 

-

的输出是:

enter main 
A(int 11) called 
A(int 14) called 
~A() with A::xx = 14 
exit main 
~A() with A::xx = 14 

-

为什么是A :: XX = 14时的析构函数叫什么名字?难道不是11?

回答

2

为什么它应该是11?你重新分配zA(14),所以最后是14。

(您的编辑后:你也看到,被在转让结束时被销毁临时A(14)对象的析构函数)

+0

但X的第一次印刷的析构函数中发生的,因此,如果第一个实例A还没有被销毁,不应该x仍然是11 – pulekies

+0

你知道每个对象都保存着一个单独的成员变量副本吗?你没有参考或静态的,只是一个普通的成员。 –

+0

第一个具有A :: xx = 14的'〜A()是临时变量的析构函数,因为它已经完成了将'z'改为14的操作。然后main结束,并且'z'被销毁,显示第二个' 〜A()与A :: xx = 14'。 –