这种行为定义明确吗?
class Foo
{
int A, B;
public:
Foo(int Bar): B(Bar), A(B + 123)
{
}
};
int main()
{
Foo MyFoo(0);
return 0;
}
不,它是未定义的。A
将首先初始化(它是类定义中的第一个),并且它使用未初始化的B
.
类成员按照它们在类定义中出现的顺序进行初始化,而不管它们在初始化列表中的顺序如何。事实上,将成员定义顺序与初始化列表顺序不匹配是不好的做法。
如果你的实例Foo
碰巧有静态持续时间,就像Foo f(0); int main(){}
,行为是明确定义的。具有静态持续时间的对象在任何其他初始化发生之前进行零初始化;在这种情况下,A
and B
当构造函数运行时将为 0。但在那之后,行为是相同的:首先A
then B
, 给予A
值为 123 和B
值为Bar
(还是丑)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)