2013-01-16 35 views
1

所以我只是陷入了一些C++的討厭。具體而言,通過引用傳遞匿名變量以用於C++中類的初始化程序列表。考慮下面的代碼;匿名變量,通過引用傳遞,初始值設定項列表

class A { 
public: 
    int x; 

    A(int x=0) : x(x) { 
    std::cout <<"A: creatred\n"; 
    } 

    ~A() { 
    std::cout << "A: destroyed\n"; 
    } 
}; 

class B { 
public: 
    A a; 

    B(const A& in) : a(in) { 
    std::cout <<"B: creatred\n"; 
    } 

    ~B() { 
    std::cout << "B: destroyed\n"; 
    } 
}; 

int main() { 
    B b(A(0)); 
    std::cout << "END\n"; 
    return 0; 
} 

輸出:

A: creatred 
B: creatred 
A: destroyed 
END 
B: destroyed 
A: destroyed 

我數2個創作和3個破壞力。這是怎麼回事?方式我看到它,我創建b時使用匿名變量A(0)作爲輸入。不確定事物的順序是什麼。創建一個對匿名變量的引用並用於複製(複製構造函數將在初始化程序列表中調用,是嗎?)成員變量a。匿名變量何時銷燬?一般來說,爲什麼我會看到2個構造函數和3個析構函數。謝謝。

+0

他們親切地稱爲臨時變量++年底被破壞。 –

+0

而不是匿名變量? – gone

回答

4

你沒有覆蓋A的拷貝構造函數打印一條消息......

具體來說,a(in)調用它。

+0

唉這就是它。感謝您的快速解答。 – gone

3

丟失的構造將是A.

拷貝構造函數您複製構造一個在下面的線。

B(const A& in) : a(in) 

A: destroyed 
END 

這是臨時被破壞,它在C的線

B b(A(0)); 
+0

感謝您的解釋。仍然試圖把我的頭圍繞着這一切 – gone