构造函数初始化列表评估顺序
我有一个构造函数需要一些参数。我曾假设它们是按照列出的顺序构建的,但在一个案例中,它们似乎正在被反向构建,导致中止。当我颠倒了争论时,程序停止了中止。这是我使用的语法的一个例子。事情是,在这种情况下,a_需要在b_之前初始化。你能保证施工的顺序吗?构造函数初始化列表评估顺序
例如
class A
{
public:
A(OtherClass o, string x, int y) :
a_(o), b_(a_, x, y) { }
OtherClass a_;
AnotherClass b_;
};
它取决于类中成员变量声明的顺序。所以a_
将是第一个,然后b_
将是你的例子中的第二个。
事实上,好的编译器会发出警告,如果你在声明与构造函数初始化列表中有不同的顺序。例如,请参阅gcc中的'-Wreorder'。 – 2009-08-07 04:17:18
它们在成员声明顺序中构造的原因而不是在构造函数中的顺序是,可能有几个构造函数,但只有一个析构函数。并且破坏者按照重建顺序销毁成员。 – AProgrammer 2009-08-07 06:45:08
引述标准,为澄清:
12.6.2.5
初始化应当按照下列顺序进行:
...
- 然后,非静态数据成员应按照他们在定义类中声明的顺序进行初始化在 (不管mem初始化器的顺序如何)。
...
你说你在问构造函数的参数,但是它们在你到达构造函数之前被评估,并且它们是以一个未指定的,编译器确定的顺序来评估的。但是你真的在询问初始化列表的顺序,所以我已经为你改变了问题标题。 – 2009-08-07 12:45:12