【问题标题】:Initialization Order of Class Data Members类数据成员的初始化顺序
【发布时间】:2010-04-19 18:35:33
【问题描述】:

在下面的代码中,当X的ctor被调用时,会先调用AB的ctor吗?它们在类主体中的放置顺序是否控制了这一点?如果有人可以提供来自 C++ 标准的文本的 sn-p 来讨论这个问题,那将是完美的。

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

【问题讨论】:

    标签: c++ initialization class-members


    【解决方案1】:

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

    5 初始化应在 以下顺序:

    ——首先,并且仅用于 派生最多的构造函数 类如下所述,虚拟基 类应在初始化 它们以深度优先的顺序出现 从左到右遍历 基的有向无环图 类,其中“从左到右”是 基类的出现顺序 派生类中的名称 基本说明符列表。

    ——那么,直接 基类应在初始化 出现的申报顺序 基本说明符列表(无论 mem-initializers 的顺序)。

    ——那么,非静态数据成员应该是 按它们的顺序初始化 在类定义中声明 (再次不管的顺序 内存初始化器)。

    ——最后是正文 构造函数的执行。 [笔记: 申报令的任务是 确保基础和成员子对象 以相反的顺序销毁 初始化。 ]

    【讨论】:

      【解决方案2】:

      初始化总是按照类成员出现在你的类定义中的顺序,所以在你的例子中是a,然后是b

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

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

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

      【讨论】:

      • 您能提供参考吗?
      • 补充一点,如果你有这样的 X 构造函数 - X(): b(), a() {} a 仍然首先初始化。
      • 我知道这一点。我要求参考。我自信地对要求参考但我找不到参考的人这么说。因此问题。
      • @Nikhil:我只是在检查参数编号。现已添加。
      • @Nikhil:如果您知道这一点,那么为什么要问这个问题?为什么不只是询问参考而不是询问您已经知道的事情?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多