为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
手掌心 2019-07-13 15:05:21
C+:类数据成员的初始化顺序在下面的代码中,当X名为Will the ctor ofA或B先打电话?它们放在类主体中的顺序是否控制了这一点?如果有人能从C+标准中提供一段文字来讨论这个问题,那就太完美了。class A {};class B {};class X{  A a;  B b;};
查看完整描述

2 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

顺序是它们在类定义中出现的顺序-这来自C+标准第12.6.2节:

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

-首先,并且仅对于下面描述的最派生类的构造函数,虚拟基类应按照它们在基类的有向无圈图的深度(首先左向右遍历)上出现的顺序进行初始化,其中“左到右”是派生类基类说明符-列表中基类名称的出现顺序。

-然后,直接基类将按声明顺序初始化,就像它们出现在基类说明符列表中一样(不管mem初始化器的顺序如何)。

-然后,非静态数据成员应按照类定义中声明的顺序进行初始化(同样,无论mem-initializer的顺序如何)。

-最后,执行构造函数的主体。[注:声明命令的任务是确保以初始化的相反顺序销毁基和子对象。]


查看完整回答
反对 回复 2019-07-13
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

初始化总是按照类成员出现在类定义中的顺序进行,在您的示例中是这样的。a,然后b.

在每个成员的初始化和您的能,会,可以将对尚未初始化的成员的引用传递到类成员的构造函数中,但您只能以有限的方式使用它(例如将其地址作为指针),其他用途很可能导致未定义的行为。

阶级成员的毁灭总是以相反的顺序发生。

基和成员的初始化顺序在12.6.2[class.base.init]/5中定义。


查看完整回答
反对 回复 2019-07-13
  • 2 回答
  • 0 关注
  • 553 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信