隐式声明的默认构造函数

implicitly declared default constructor

本文关键字:默认 构造函数 声明      更新时间:2023-10-16

我对以下陈述感到困惑。

从规范:

在类的隐式声明的默认构造函数之前 隐式定义,所有隐式声明的默认构造函数 对于其基类及其非静态数据成员应为 隐式定义。

我的理解是:

隐式声明的默认构造函数在以下情况下隐式定义 对象已创建。

上面的语句是什么意思?如果基类包含显式默认构造函数,则派生类不能具有隐式默认构造函数?。请澄清一下,如果有人提供一段示例代码可能会很好。

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

举个例子:

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

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

假设你有类BaseDerived(从base派生(。

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

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

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