2011-10-23 156 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'。 –