2009-08-07 70 views
202

我有一個構造函數需要一些參數。我曾假設它們是按照列出的順序構建的,但在一個案例中,它們似乎正在被反向構建,導致中止。當我顛倒了爭論時,程序停止了中止。這是我使用的語法的一個例子。事情是,在這種情況下,a_需要在b_之前初始化。你能保證施工的順序嗎?構造函數初始化列表評估順序

例如

class A 
{ 
    public: 
    A(OtherClass o, string x, int y) : 
     a_(o), b_(a_, x, y) { } 

    OtherClass a_; 
    AnotherClass b_; 
}; 
+3

你說你在問構造函數的參數,但是它們在你到達構造函數之前被評估,並且它們是以一個未指定的,編譯器確定的順序來評估的。但是你真的在詢問初始化列表的順序,所以我已經爲你改變了問題標題。 – 2009-08-07 12:45:12

回答

220

它取決於類中成員變量聲明的順序。所以a_將是第一個,然後b_將是你的例子中的第二個。

+15

事實上,好的編譯器會發出警告,如果你在聲明與構造函數初始化列表中有不同的順序。例如,請參閱gcc中的'-Wreorder'。 – 2009-08-07 04:17:18

+207

它們在成員聲明順序中構造的原因而不是在構造函數中的順序是,可能有幾個構造函數,但只有一個析構函數。並且破壞者按照重建順序銷燬成員。 – AProgrammer 2009-08-07 06:45:08

170

引述標準,爲澄清:

12.6.2.5

初始化應當按照下列順序進行:

...

  • 然後,非靜態數據成員應按照他們在定義類中聲明的順序進行初始化在 (不管mem初始化器的順序如何)。

...

4

standard reference此現在看來是12.6.2節13.3:

(13.3) - 然後,非靜態數據成員被初始化按照它們在類定義 中聲明的順序(不管mem初始化程序的順序如何)。