【发布时间】:2010-04-19 18:35:33
【问题描述】:
在下面的代码中,当X的ctor被调用时,会先调用A或B的ctor吗?它们在类主体中的放置顺序是否控制了这一点?如果有人可以提供来自 C++ 标准的文本的 sn-p 来讨论这个问题,那将是完美的。
class A {};
class B {};
class X
{
A a;
B b;
};
【问题讨论】:
标签: c++ initialization class-members
在下面的代码中,当X的ctor被调用时,会先调用A或B的ctor吗?它们在类主体中的放置顺序是否控制了这一点?如果有人可以提供来自 C++ 标准的文本的 sn-p 来讨论这个问题,那将是完美的。
class A {};
class B {};
class X
{
A a;
B b;
};
【问题讨论】:
标签: c++ initialization class-members
顺序是它们出现在类定义中的顺序 - 这是来自 C++ 标准的第 12.6.2 节:
5 初始化应在 以下顺序:
——首先,并且仅用于 派生最多的构造函数 类如下所述,虚拟基 类应在初始化 它们以深度优先的顺序出现 从左到右遍历 基的有向无环图 类,其中“从左到右”是 基类的出现顺序 派生类中的名称 基本说明符列表。
——那么,直接 基类应在初始化 出现的申报顺序 基本说明符列表(无论 mem-initializers 的顺序)。
——那么,非静态数据成员应该是 按它们的顺序初始化 在类定义中声明 (再次不管的顺序 内存初始化器)。
——最后是正文 构造函数的执行。 [笔记: 申报令的任务是 确保基础和成员子对象 以相反的顺序销毁 初始化。 ]
【讨论】:
初始化总是按照类成员出现在你的类定义中的顺序,所以在你的例子中是a,然后是b。
在每个成员的初始化之间都有一个序列点,您可以将对尚未初始化的成员的引用传递给类成员的构造函数,但您只能以有限的方式使用它(例如将其地址形成一个指针),其他用途很可能会导致未定义的行为。
类成员的破坏总是以构造的相反顺序发生。
基和成员的初始化顺序在 12.6.2 [class.base.init]/5 中定义。
【讨论】: