【问题标题】:When is an initialization list looked up by C++C++ 何时查找初始化列表
【发布时间】:2017-05-21 07:53:05
【问题描述】:

我试图了解在基类和类非静态成员实例化期间何时引用(涉及)初始化列表。看过this的文章和this的文章,总结了一个类的初始化顺序(我这里总结了)

初始化应按以下顺序进行:

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

  • 然后,直接基类应在 出现在基本说明符列表中的声明顺序 (不管 mem-initializers 的顺序如何)。

  • 然后,非静态 数据成员应按照它们被声明的顺序进行初始化 类定义(同样不管 内存初始化器)。最后,构造函数的主体被执行。

  • 最后,构造函数的主体被执行。

现在我通过阅读以上内容了解到,首先创建基类,然后创建派生类。成员也按照它们在类定义中声明的顺序进行实例化,而不管它们在初始化列表中的位置。

这让我觉得每次在类实例化期间实例化基类或成员变量时(按照上面指定的顺序)C++ 基本上都会检查类的初始化列表以查看是否指定了任何特定参数或参数对于该基类或成员变量。如果未指定任何内容,则 c++ 会执行默认构造函数调用。我的理解是否正确。如果我错了,请纠正我。

【问题讨论】:

    标签: c++ class initialization initialization-list


    【解决方案1】:

    是的,您是正确的1,当您没有初始化 member-initialization-list 中的基类或非静态成员时,或者当您根本不提供 member-initialization-list,以下适用:

    class.base.init/9

    在非委托构造函数中,如果给定的潜在构造 子对象不是由 mem-initializer-id 指定的(包括 没有 mem-initializer-list 的情况,因为构造函数 没有ctor-initializer),那么

    • 如果实体是具有默认成员初始值设定项的非静态数据成员,并且

      • 构造函数的类是一个联合体,并且该联合体的其他变体成员没有由 mem-initializer-id

      • 指定
      • 构造函数的类不是联合,并且,如果实体是匿名联合的成员,则该联合的任何其他成员都不是 由 mem-initializer-id 指定,

      -- 根据 [dcl.init] 中指定的 默认成员初始化器 初始化实体;

    • 否则,如果实体是匿名联合或变体成员([class.union.anon]),则不执行初始化;

    • 否则,实体会默认初始化


    1:你说:

    ...如果未指定任何内容,则 c++ 会调用默认构造函数...

    有点迂腐,上面引用中的 default initialized 并不总是意味着将调用默认构造函数,例如,在int 这样的非类类型的情况下默认初始化取决于存储时间。

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      相关资源
      最近更新 更多