在c ++中是否未定义类的成员变量的构造顺序?

sji*_*sji 4 c++

可能重复:
成员字段,构造顺序

如果我有一个有两个成员的班级,如下:

class A
{
    int a;
    int b;
    A() {}
};
Run Code Online (Sandbox Code Playgroud)

为了ab构造不确定

如果我使用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的顺序如何).