子对象初始化的顺序是什么?

St.*_*rio 2 c++ initialization

让我们有一个o类的对象,它包含成员子对象sosso另一个类类型.请考虑以下示例:

#include <iostream>
using namespace std;
    struct SO{ SO(){ cout << "SO()" << endl; } };
    struct SSO{ SSO(){ cout << "SSO()" << endl; } };

        struct O
        {
            O(){ cout << "O()" << endl; }
            SO so;
            SSO sso;
        };
    int main()
    {
        O o = *(new O);
    }
Run Code Online (Sandbox Code Playgroud)

输出:

SO()

SSO()

O()
Run Code Online (Sandbox Code Playgroud)

演示

5.3.4节所述:

创建类型为T的对象的new-expression初始化该对象,如下所示:

- 如果省略new-initializer,则默认初始化对象(8.5); 如果没有执行初始化,则该对象具有不确定的值.

- 否则,根据8.5的初始化规则解释new-initializer以进行直接初始化.

o在该特定情况下,对对象执行默认初始化(即构造函数调用).但他的子对象怎么样?似乎也执行默认初始化.但是,如果它的完整对象是默认初始化的话,它在标准中指定了对任何子对象执行默认初始化的位置?

AnT*_*AnT 6

说对象执行默认初始化是不正确的o.在您的示例对象o中进行了复制初始化.您的示例中的默认初始化是针对由其创建的未命名对象执行的new(随后会被泄露).

现在,您O创建的未命名对象类型new确实是默认初始化的,在这种情况下意味着它是通过调用用户定义的默认构造函数来初始化的O::O().构造函数中的O::O()构造函数初始值设定项列表完全不存在,即未提及任何子对象.这意味着这些子对象将默认初始化.

如中所述

12.6.2初始化基础和成员

8在非委托构造,如果一个给定的非静态数据成员或基类不是由指定MEM-初始化-ID(包括其中不存在的情况下MEM-初始化列表因为构造不具有构造函数,初始化然后,实体不是抽象类(10.4)的虚基类

- 如果实体是具有大括号或等于初始化程序的非静态数据成员,则按照8.5中的规定初始化该实体;

- 否则,如果实体是变体成员(9.5),则不执行初始化;

- 否则,实体默认初始化(8.5).

最后一个选项适用于您的情况.(编号可能已关闭,因为我正在使用该文档的草稿版本.)

请注意,您的问题标题提到了"子对象初始化的顺序",而实际问题与订单本身无关.它是关于初始化的方法.