用初始化器列表中的空构造函数初始化父类?
在初始化子初始化列表中的空构造父类时是否存在任何危险?用初始化器列表中的空构造函数初始化父类?
例子:
class Parent
{
public:
Parent(){}
~Parent(){}
};
class Child : public Parent
{
public:
Child(): Parent()
{}
~Child(){}
};
原因的问题:我经常看到那里有一个空的构造函数“父”类不符合儿童构造函数初始化列表初始化代码。
假设Parent
没有用户提供的构造函数,例如,如果它是一个聚集:
struct Parent
{
int x;
int get_value() const { return x; }
};
现在有一个差(参见[dcl.init] /(8.1)),由于Parent
值初始化将零初始化构件x
,而缺省初始化将没有:
struct GoodChild : Parent { GoodChild() : Parent() {} };
struct BadChild : Parent { BadChild() {} };
因此:
int n = GoodChild().get_value(); // OK, n == 0
int m = BadChild().get_value(); // Undefined behaviour
具体来说,根据C++ 11,当初始化程序没有给出时('[C++ 11:12.6.2/8]'),基地将被默认初始化,并且默认初始化聚合没有任何用处。相比之下,在_ctor-initialiser_中包含'Parent()'将最终对其成员进行初始化('[C++ 11:12.6.2/7]')。 – 2014-09-05 21:38:01
Downvoter,小心解释你的反对意见吗?我很乐意提高不明确或缺失的分数(或者只是自己编辑它)。 – 2014-09-05 21:54:55
@ T.C .:这很有道理,谢谢。我编辑了这篇文章以反映这一点。 (清理评论。) – 2014-09-06 11:08:31
默认构造函数是隐式调用,如果你不显式调用初始化列表构造。 – scohe001 2014-09-05 21:15:01