首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐式声明默认构造函数

隐式声明默认构造函数
EN

Stack Overflow用户
提问于 2012-07-20 12:57:41
回答 2查看 3.6K关注 0票数 2

我对以下的说法感到困惑。

从规范中:

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

我所了解的是:

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-20 13:00:56

假设您有类BaseDerived (这是从基派生的)。

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-07-20 13:02:29

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

举个例子:

代码语言:javascript
复制
struct A { int x; };    
struct B { A a; };      // [1]
int main() {
   B b;                 // [2]
}

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11579853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档