2012-09-05 46 views
4

可能重复:
Member fields, order of construction在C++中未定义类的构造变量的顺序?

如果我有两个成员像这样一类:

class A 
{ 
    int a; 
    int b; 
    A() {} 
}; 

是在为了其中ab构造undefined

如果我使用cl,那么无论我按什么顺序调用构造函数,成员总是按照它们在类中声明的顺序构造。在这种情况下,将永远是a然后b,即使我定义构造为A,如:

A() : b(), a() {} 

但我假设那是编译器特定的只是行为。

+0

你的问题是什么? –

+0

@CodingMash是啊我有点问它两种方式没有我。希望现在很清楚。 – sji

+0

是啊... 虽然现在很多好的答案。 –

回答

13

编号成员按其声明的顺序构建。

建议您按照相同的顺序排列您的初始化程序列表,但不要求这样做。如果您不这样做并且可能会导致难以检测到的错误,那就太令人困惑了。

例子:

struct Foo { 
    int a; int b; 
    Foo() : b(4), a(b) { } // does not do what you think! 
}; 

这种结构实际上是不确定的行为,因为你在初始化a(b)读取未初始化的变量。


标准参考(C++ 11,12.6.2/10):

- 然后,如它们出现在基地说明符列表(直接基类中声明的顺序初始化不管mem-initializers的顺序如何)。

- 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(不管mem-initializers的顺序如何)。

+0

该标准是否需要以声明顺序构造,还是大多数编译器如何实现它? –

+1

@KarlBielefeldt它是在标准中定义的。否则这个答案会是最具误导性的! – juanchopanza

+1

这是必需的。 – jcoder

2

初始化的顺序与该类中声明的顺序相同。

如果构造函数初始化列表中的顺序不同,编译器通常会发出警告。例如,对于类:

class A { 
public: 
    A() : b(1), a(b) {} 
private 
    int a; 
    int b; 
}; 

GCC将警告:

$ g++ -Wall c.cc 
c.cc:5: error: expected `:' before ‘int’ 
c.cc: In constructor ‘A::A()’: 
c.cc:6: warning: ‘A::b’ will be initialized after 
c.cc:5: warning: ‘int A::a’ 
c.cc:3: warning: when initialized here 

这是因为它很容易导致错误。在上面的例子中,值a将是未指定的。