【问题标题】:implicitly declared default constructor隐式声明的默认构造函数
【发布时间】:2012-07-19 18:14:18
【问题描述】:

我对以下陈述感到困惑。

来自规范:

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

我的理解是:

隐式声明的默认构造函数在 对象已创建。

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

【问题讨论】:

  • 如果你熟悉美国电视节目,这类似于警方熟悉的声明:"..你有权请律师。如果你买不起,请一名将提供...”。如果你已经有一个,你就没有第二个了。

标签: c++ c++11


【解决方案1】:

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

举个例子:

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

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

【讨论】:

  • 所以,如果我理解正确,1) 定义发生在创建对象时,2) 它确保其所有成员都隐式定义了默认构造函数及其基类?我说的对吗?
  • 很好的例子。为它点赞。 :)
【解决方案2】:

假设您有 BaseDerived 类(派生自基类)。

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

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

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

【讨论】:

  • 如果基类包含显式定义的默认构造函数怎么办?什么都没有?
  • @Whoami,如果有一个为Base 显式定义和声明的默认构造函数(简称为“真实”),那么我们不需要隐式声明的构造函数。因此,将定义 Derived 的隐式声明构造函数,然后使用基类中的“真实”构造函数和派生类中隐式声明的构造函数创建对象。
  • @Whoami,基本上,这个想法是“当构造函数被调用时,它应该存在”。所以如果你实现了一个构造函数,它将被使用。如果没有,编译器会生成一个默认构造函数,然后使用它。
  • 该规则还间接表示,如果不能隐式定义基类构造函数(因为它包含需要显式初始化的内容),则派生类的默认构造函数将 被隐式定义。
猜你喜欢
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多