代码之家  ›  专栏  ›  技术社区  ›  Nikhil

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

  •  32
  • Nikhil  · 技术社区  · 15 年前

    在下面的代码中,当 X 被称为威尔 A B 先打电话?它们在类主体中的放置顺序是否控制此操作?如果有人可以从C++标准中提供一段关于这个问题的文本片段,那将是完美的。

    class A {};
    class B {};
    class X
    {
     A a;
     B b;
    };
    
    2 回复  |  直到 7 年前
        1
  •  54
  •   anon    15 年前

    顺序是它们在类定义中出现的顺序——这是从C++标准的第12.2节中得出的:

    5初始化应在 以下顺序:

    首先,而且只为 最派生的 类,如下所述,虚拟基 类应在 它们先出现在一个深度上 从左到右遍历 有向无环基图 类,其中“从左到右”是 基类的出现顺序 派生类中的名称 基说明符列表。

    然后,直接 基类应在 它们出现的申报顺序 基本说明符列表(不管 mem初始化器的顺序)。

    那么,非静态数据成员 按它们的顺序初始化 在类定义中声明 (同样,不管 mem初始化器)。

    最后,尸体 执行构造函数的。[注: 申报令的任务是 确保基对象和成员子对象 以相反的顺序销毁 初始化。]

        2
  •  9
  •   CB Bailey    15 年前

    初始化总是按照类成员在类定义中出现的顺序进行,因此在您的示例中 a 然后 b .

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

    班子成员的破坏总是按相反的顺序进行。

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

    推荐文章