2014-09-05 146 views
0

在初始化子初始化列表中的空构造父类时是否存在任何危险?用初始化器列表中的空构造函数初始化父类?

例子:

class Parent 
{ 
    public: 
    Parent(){} 
    ~Parent(){} 
}; 

class Child : public Parent 
{ 
    public: 
    Child(): Parent() 
    {} 
    ~Child(){} 
}; 

原因的问题:我经常看到那里有一个空的构造函数“父”类不符合儿童构造函数初始化列表初始化代码。

+3

默认构造函数是隐式调用,如果你不显式调用初始化列表构造。 – scohe001 2014-09-05 21:15:01

回答

1

假设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 
+1

具体来说,根据C++ 11,当初始化程序没有给出时('[C++ 11:12.6.2/8]'),基地将被默认初始化,并且默认初始化聚合没有任何用处。相比之下,在_ctor-initialiser_中包含'Parent()'将最终对其成员进行初始化('[C++ 11:12.6.2/7]')。 – 2014-09-05 21:38:01

+1

Downvoter,小心解释你的反对意见吗?我很乐意提高不明确或缺失的分数(或者只是自己编辑它)。 – 2014-09-05 21:54:55

+0

@ T.C .:这很有道理,谢谢。我编辑了这篇文章以反映这一点。 (清理评论。) – 2014-09-06 11:08:31

相关问题