我试图理解在基类和类非静态成员实例化期间引用(涉及)初始化列表的时间。我已阅读this文章和this文章,总结了课程的初始化顺序(我在此总结了它)
初始化应按以下顺序进行:
首先,仅适用于派生程度最高的类的构造函数 如下所述,虚拟基类应在中初始化 命令它们出现在深度优先从左到右的遍历中 基类的有向非循环图,其中“从左到右”是 派生类中基类名称的出现顺序 基本符列表。
然后,应该在中初始化直接基类 声明顺序,因为它们出现在base-specifier-list中 (不管mem-initializers的顺序如何)。
然后,非静止 数据成员应按其声明的顺序进行初始化 类定义(再次无论顺序如何 MEM-初始化)。最后,执行构造函数的主体。
最后,执行构造函数的主体。
现在我通过阅读以上内容了解到,首先创建基类,然后创建派生类。成员也按照它们在类定义中声明的顺序进行实例化,而不管它们在初始化列表顺序中的位置。
这让我觉得每次实例化类实例化期间的基类或成员变量时(按照上面指定的顺序),C ++基本上会检查类的初始化列表,以查看是否指定了任何特定的参数或参数对于该基类或成员变量。如果没有指定任何内容,则c ++执行默认构造函数调用。我的理解是否正确。如果我错了,请纠正我。
答案 0 :(得分:0)
是的,当你没有在 member-initialization-list 中初始化基类或非静态成员时,你是正确的 1 ,或者当您根本不提供成员初始化列表时,以下内容适用:
在非委托构造函数中,如果给定可能构造的 子对象不是由 mem-initializer-id 指定的(包括 因为构造函数没有 mem-initializer-list 的情况 没有 ctor-initializer ),然后
- 中所述
如果实体是具有默认成员初始化程序且
的非静态数据成员
- 指定
构造函数的类是一个联合,并且该联合的其他变体成员没有被 mem-initializer-id 或
构造函数的类不是联合,并且,如果实体是匿名联合的成员,则该联合的其他成员不是 由 mem-initializer-id 指定,
- 实体从其默认成员初始值设定项初始化,如[dcl.init];
否则,如果实体是匿名联合或变体成员([class.union.anon]),则不执行初始化;
否则,该实体默认初始化。
1 :你说:
...如果没有指定任何内容,那么c ++会进行默认构造函数调用...
有点迂腐,在上面的引用中默认初始化并不总是意味着将调用默认构造函数,例如,在非类类型的情况下,例如{{ 1}} 默认初始化取决于存储持续时间。