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

标签 c++

<分区>

Possible Duplicate:
Member fields, order of construction

如果我的类(class)有两个这样的成员:

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

构造ab顺序是否未定义

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

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

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

最佳答案

没有。成员按照声明的顺序构造。

建议您以相同的顺序排列您的初始化列表,但您不是必须这样做。如果您不这样做,将会非常困惑,并且可能会导致难以检测的错误。

例子:

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):

— Then, direct base classes are initialized in declaration order as they appear in the base-specifier-list (regardless of the order of the mem-initializers).

— Then, non-static data members are initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers).

关于c++ - c++中类成员变量的构造顺序是未定义的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12285638/

相关文章:

c++ - 为什么我可以在方法中使用 'this'

c++ - 如何知道异步状态机何时终止。 ( boost::状态图)

c++ - 消除c++中菱形继承(钻石问题)访问顶级成员的歧义

c++ - C++ 算法的迭代器类别要求

c++ - 在派生构造函数中访问基本成员时出现问题

c++ - 如何在不执行的情况下捕获未定义的行为?

c++ - 确定文件是否可以在 C++ 中创建/不是只读

c++ - 使用 tr1 <random> 创建非均匀整数分布

c++ - 从基类特定函数调用子类方法

c++ - 为什么 wchar_t/unsigned short 现在是不同的,但没有类似的 char/unsigned byte 区别?