C++:类数据成员的初始化顺序

Nik*_*hil 36 c++ initialization class-members

在下面的代码中,当X被调用的ctor 首先被调用A或被B调用时?它们放在班级正文中的顺序是否控制了这个?如果有人可以提供C++标准的一小段文本来讨论这个问题,那将是完美的.

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

小智 62

顺序是它们在类定义中出现的顺序 - 这来自C++标准的第12.6.2节:

5初始化应按以下顺序进行:

- 首先,仅对于如下所述的派生类最多的构造函数,虚拟基类应按它们出现在基类有向无环图的深度优先从左到右遍历的顺序进行初始化,其中" "从左到右"是派生类base-specifier-list中基类名称的出现顺序.

- 然后,直接基类应按声明顺序初始化,因为它们出现在base-specifier-list中(无论mem-initializers的顺序如何).

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

- 最后,执行构造函数的主体.[注意:声明顺序的作用是确保以初始化的相反顺序销毁基础和成员子对象.]


CB *_*ley 9

初始化总是在该类的成员出现在你的类定义的顺序,所以在你的榜样a,那么b.

在每个成员的初始化之间有一个序列点,您可以将对尚未初始化的成员的引用传递给类成员的构造函数,但是您只能以有限的方式使用它(例如地址形成指针),其他用途可能会导致未定义的行为.

类成员的破坏总是以与构造相反的顺序发生.

基数和成员的初始化顺序在12.6.2 [class.base.init]/5中定义.

  • 除此之外,如果您有一个像这样的 X 构造函数 - X(): b(), a() {} a 仍然首先初始化。 (4认同)