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

时间:2010-04-19 18:35:33

标签: c++ initialization class-members

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

class A {};
class B {};
class X
{
 A a;
 B b;
};

2 个答案:

答案 0 :(得分:59)

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

  

5初始化应在   以下顺序:

     

- 首先,仅限于   派生最多的构造函数   类如下所述,虚拟基础   课程应在课程中初始化   命令它们出现在深度优先   从左到右遍历   有向无环图的基数   类,“从左到右”是   基类的出现顺序   派生类中的名称   基本符列表。

     

- 然后,直接   基类应初始化为   声明顺序,因为它们出现在   base-specifier-list(不管是什么   mem-initializers的顺序。)

     

- 然后,非静态数据成员应该是   按照他们的顺序初始化   在类定义中声明   (再次无论顺序如何   MEM-初始化)。

     

- 最后,身体   构造函数的执行。 [注意:   声明命令是强制性的   确保基础和成员子对象   以相反的顺序被摧毁   初始化。 ]

答案 1 :(得分:9)

初始化始终按照班级成员在班级定义中的显示顺序排列,因此在您的示例中a,然后是b

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

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

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