隐式声明默认构造函数

时间:2012-07-20 12:57:42

标签: c++ c++11

我对以下陈述感到困惑。

来自规范:

  

在隐式声明的类的默认构造函数之前   隐式定义,所有隐含声明的默认构造函数   对于它的基类和它的非静态数据成员应该是   含蓄地定义。

我的理解是:

  

隐式声明的默认构造函数是在隐式定义的时候   对象已创建。

以上陈述的含义是什么?如果基类包含显式默认构造函数,那么派生类不能有隐式默认构造函数?请澄清一下,如果有人提供一些示例代码,那就太好了。

2 个答案:

答案 0 :(得分:4)

该语句意味着当编译器必须为隐式声明的默认构造函数提供定义时(即当这样的构造函数是 odr-used 时),之前的定义当前构造函数,编译器必须确保所有成员都可以默认构造,为此,它可能需要隐式定义成员的任何隐式声明的默认构造函数。

举个例子:

struct A { int x; };    
struct B { A a; };      // [1]
int main() {
   B b;                 // [2]
}

[2]中变量b的定义是B隐式声明的构造函数的 odr-use ,但在编译器隐式定义{{1}之前因为它有一个在[1]中声明的B::B()类型的成员,所以它需要隐式定义A。原因是A::A()将在其初始化列表中 odr-use B::B()

答案 1 :(得分:2)

假设您有类BaseDerived(来自基础)。

让我们假设它们都隐式声明了默认构造函数。当您创建Derived类的对象时,将发生以下情况。 第一个,将定义Base类的隐式声明的默认构造函数。 之后,对Derived类的隐式声明构造函数也会发生同样的情况。

这完全有道理,因为当您创建Derived类的对象时,首先会调用Base类的构造函数。如果它不会被那个时间定义,那么可能会发生一些不好的事情。

同样的事情适用于具有此类构造函数的任何类成员:这些构造函数将在类自己的构造函数定义之前定义。