2010-03-25 44 views
9

我對C++中的構造和初始化順序保證有些懷疑。例如,下面的代碼有四個類X,Y,ZW。主函數實例化一個對象class X,它包含一個對象class Y,並從class Z派生,所以這兩個構造函數都會被調用。此外,傳遞給X的構造函數的const char*參數將隱式轉換爲class W的對象,因此還必須調用W的構造函數。C++:構造和初始化順序保證

C++標準對複製構造函數的調用順序提供了什麼保證?或者,等同地,這個程序被允許打印什麼?

#include <iostream> 

class Z { 
    public: 
    Z() { std::cout << "Z" << std::endl; } 
}; 

class Y { 
    public: 
    Y() { std::cout << "Y" << std::endl; } 
}; 

class W { 
    public: 
    W(const char*) { std::cout << "W" << std::endl; } 
}; 

class X : public Z { 
    public: 
    X(const W&) { std::cout << "X" << std::endl; } 
    private: 
    Y y; 
}; 

int main(int, char*[]) { 
    X x("x"); 
    return 0; 
} 

編輯:這是正確的嗎?

W  | 
/ \ | 
Z  Y | 
\ / | 
    X  V 
+1

的順序將是W艙的, Z,Y,X但我不確定具體規則。 – 2010-03-25 16:00:47

+0

Y和W之間的關係是什麼? – curiousguy 2015-08-26 08:21:01

回答

15

在所有類中,構造順序都是保證的:基類,從左到右依次指定,後面跟着類定義中聲明的順序的成員變量。一旦完成了所有基地和成員的建築,一個類的構造函數體將被執行。

在您的例子XZ衍生和包含Y所以Z基礎對象首先構造,則Y構件y,則X的建設完成與X的構造體的執行。

臨時W需要傳遞到X構造函數,所以構造之前x的建設開始,將再次的x完成初始化被破壞。

所以程序必須打印:

W 
Z 
Y 
X 
6

1)首先,需要計算參數。

2)然後構造基類。

3)然後按照班級聲明中出現的順序構造成員。

4)然後X的構造被稱爲

+0

只是添加...基類也是按照從左到右的順序構造的,它們在繼承時出現 – 2010-03-25 17:17:37

+0

@Yogesh,當然,謝謝 – 2010-03-25 17:49:05

2
  1. 將W對象稱爲構造函數X之前將構造。
  2. Z,作爲基類是X,將X的
  3. ý將initalized成員之前構件初始化
  4. X的構造將運行期間初始化。
2

要在查爾斯貝利的回答擴大,當你的基類虛擬繼承規則的改變。我經常忘記命令是什麼,IBM網站說,虛擬基地首先被初始化,但我從來沒有遇到過這種情況,它實際上不僅僅是瑣事。

2

總結這些規則:

  1. 參數,從右到左
    拍攝的。最右邊
    b。右二
  2. 基類,左
  3. 虛擬基礎
  4. 基類權
  5. 成員在聲明的順序類
  6. 構造稱爲