何时由C ++查找初始化列表

时间:2017-05-21 07:53:06

标签: c++ class initialization initialization-list

我试图理解在基类和类非静态成员实例化期间引用(涉及)初始化列表的时间。我已阅读this文章和this文章,总结了课程的初始化顺序(我在此总结了它)

  

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

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

  •   
  • 然后,应该在中初始化直接基类   声明顺序,因为它们出现在base-specifier-list中   (不管mem-initializers的顺序如何)。

  •   
  • 然后,非静止   数据成员应按其声明的顺序进行初始化   类定义(再次无论顺序如何   MEM-初始化)。最后,执行构造函数的主体。

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

  •   

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

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

1 个答案:

答案 0 :(得分:0)

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

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 ++会进行默认构造函数调用...

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