在以下代码中,当调用X
的ctor时,首先调用A
或B
的ctor?它们放在班级正文中的顺序是否控制了这个?如果有人可以提供C ++标准的一小段文本来讨论这个问题,那将是完美的。
class A {};
class B {};
class X
{
A a;
B b;
};
答案 0 :(得分:59)
顺序是它们在类定义中出现的顺序 - 这来自C ++标准的第12.6.2节:
5初始化应在 以下顺序:
- 首先,仅限于 派生最多的构造函数 类如下所述,虚拟基础 课程应在课程中初始化 命令它们出现在深度优先 从左到右遍历 有向无环图的基数 类,“从左到右”是 基类的出现顺序 派生类中的名称 基本符列表。
- 然后,直接 基类应初始化为 声明顺序,因为它们出现在 base-specifier-list(不管是什么 mem-initializers的顺序。)
- 然后,非静态数据成员应该是 按照他们的顺序初始化 在类定义中声明 (再次无论顺序如何 MEM-初始化)。
- 最后,身体 构造函数的执行。 [注意: 声明命令是强制性的 确保基础和成员子对象 以相反的顺序被摧毁 初始化。 ]
答案 1 :(得分:9)
初始化始终按照班级成员在班级定义中的显示顺序排列,因此在您的示例中a
,然后是b
。
在每个成员的初始化之间有一个序列点,你可以将对尚未初始化的成员的引用传递给类成员的构造函数,但是你只能够以有限的方式使用它(例如将其地址形成指针),其他用途可能会导致未定义的行为。
类成员的破坏总是以与构造相反的顺序发生。
基础和成员的初始化顺序在12.6.2 [class.base.init] / 5中定义。