C+:类数据成员的初始化顺序

C+:类数据成员的初始化顺序

在下面的代码中,当X名为Will the ctor ofAB先打电话?它们放在类主体中的顺序是否控制了这一点?如果有人能从C+标准中提供一段文字来讨论这个问题,那就太完美了。

class A {};class B {};class X{
 A a;
 B b;};


手掌心
浏览 554回答 2
2回答

LEATH

顺序是它们在类定义中出现的顺序-这来自C+标准第12.6.2节:5.初始化应按以下顺序进行:-首先,并且仅对于下面描述的最派生类的构造函数,虚拟基类应按照它们在基类的有向无圈图的深度(首先左向右遍历)上出现的顺序进行初始化,其中“左到右”是派生类基类说明符-列表中基类名称的出现顺序。-然后,直接基类将按声明顺序初始化,就像它们出现在基类说明符列表中一样(不管mem初始化器的顺序如何)。-然后,非静态数据成员应按照类定义中声明的顺序进行初始化(同样,无论mem-initializer的顺序如何)。-最后,执行构造函数的主体。[注:声明命令的任务是确保以初始化的相反顺序销毁基和子对象。]

繁花不似锦

初始化总是按照类成员出现在类定义中的顺序进行,在您的示例中是这样的。a,然后b.在每个成员的初始化和您的能,会,可以将对尚未初始化的成员的引用传递到类成员的构造函数中,但您只能以有限的方式使用它(例如将其地址作为指针),其他用途很可能导致未定义的行为。阶级成员的毁灭总是以相反的顺序发生。基和成员的初始化顺序在12.6.2[class.base.init]/5中定义。
打开App,查看更多内容
随时随地看视频慕课网APP