可能重复:
成员字段,构造顺序
如果我有一个有两个成员的班级,如下:
class A
{
int a;
int b;
A() {}
};
Run Code Online (Sandbox Code Playgroud)
是为了在a和b构造不确定?
如果我使用cl,那么无论我调用构造函数的顺序如何,成员总是按照它们在类中声明的顺序构造.在这种情况下,它会永远a那么b,即使我定义的构造方法A,如:
A() : b(), a() {}
Run Code Online (Sandbox Code Playgroud)
但我假设这只是特定编译器的行为.
Ker*_* SB 13
不会.会员按照宣布的顺序建造.
建议您按照相同的顺序安排初始化列表,但不要求您这样做.如果你不这样做会非常混乱,并可能导致难以发现的错误.
例:
struct Foo {
int a; int b;
Foo() : b(4), a(b) { } // does not do what you think!
};
Run Code Online (Sandbox Code Playgroud)
这种结构实际上是未定义的行为,因为您正在初始化器中读取未初始化的变量a(b).
标准参考(C++ 11,12.6.2/10):
- 然后,直接基类按声明顺序初始化,因为它们出现在base-specifier-list中(无论mem-initializers的顺序如何).
- 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管mem-initializers的顺序如何).