首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子对象初始化的顺序是什么?

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

Stack Overflow用户
提问于 2014-08-13 04:27:55
回答 3查看 559关注 0票数 2

让我们有一个类的对象o --某种类型,它包含成员、子对象、so和其他类类型的sso。请考虑以下示例:

代码语言:javascript
复制
#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);
    }

输出:

代码语言:javascript
复制
SO()

SSO()

O()

演示

正如第5.3.4节所指出的,

创建类型为T的对象的新表达式将该对象初始化如下: -如果省略新的初始化器,则该对象为默认初始化(8.5);如果不执行初始化,则该对象具有不确定的值。 -否则,将根据8.5的初始化规则解释新的初始化程序,以进行直接初始化.

在特定情况下,对对象o执行默认初始化(即构造函数调用)。但他的小玩意呢?似乎也会执行默认初始化。但是,如果任何子对象的完整对象都是默认初始化的,那么在标准中指定在哪里执行默认初始化呢?

EN

回答 3

Stack Overflow用户

发布于 2014-08-13 04:33:51

如果说为对象o执行默认初始化是不正确的。在示例对象中,o是复制初始化的。您的示例中的默认初始化是为new创建的未命名对象执行的(该对象随后会泄漏)。

现在,由O创建的类型为new的未命名对象实际上是默认初始化的,在本例中,这意味着它是通过调用用户定义的默认构造函数O::O()来初始化的。O::O()构造函数中的构造函数初始化程序列表完全不存在,即没有提到任何子对象。这意味着这些子对象将被默认初始化。

如上文所述

12.6.2初始化基和成员()

非委托构造函数中的8,如果给定的非静态数据成员或基类不是由mem初始化程序id指定的(包括由于构造函数没有ctor初始化器而没有mem初始化程序列表的情况),且实体不是抽象类的虚拟基类(10.4),则该实体不是抽象类的虚拟基类。 -如果实体是具有大括号或等初始化器的非静态数据成员,则按8.5中指定的方式初始化该实体; -否则,如果该实体是一个变体成员(9.5),则不执行初始化; -否则,实体是默认的-初始化(8.5)。

最后一个选项适用于您的情况。(由于我使用的是文档的草稿版本,所以编号可能是关闭的。)

请注意,问题的标题提到了“次对象初始化的顺序”,而实际的问题与顺序本身无关。它是关于初始化的方法。

票数 6
EN

Stack Overflow用户

发布于 2014-08-13 04:40:31

12.6.2/10

在非委托构造函数中,初始化按以下顺序进行:

  • 首先,并且仅针对最派生类(1.8)的构造函数,虚拟基类按照它们在基类有向无圈图的深度第一左右遍历上出现的顺序进行初始化,其中“左到右”是派生类base-specifier-list中基类的出现顺序。
  • 然后,直接基类按声明顺序初始化,就像它们出现在基类说明符列表中一样(不管mem-initializer的顺序如何)。
  • 然后,按照类定义中声明的顺序初始化非静态数据成员(同样不考虑mem初始化器的顺序)。
  • 最后,执行构造函数体的复合语句。

因此:无论选择哪个构造函数进行初始化--默认的还是其他的,显式默认的还是用户提供的--首先初始化虚拟基类,然后初始化直接基类(按照它们出现在基类说明符-列表中的顺序,而不是按照它们在ctor-初始化器中出现的顺序);最后,非静态数据成员子对象按声明顺序初始化。

票数 4
EN

Stack Overflow用户

发布于 2014-08-13 04:33:33

默认情况下,8.5/6 -初始化T类型的对象意味着:

  • 如果T是(可能是cv限定的)类类型(第9条),则调用T的默认构造函数.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25278066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档