2009-08-07 71 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初始化程序的顺序如何)。