我对以下的说法感到困惑。
从规范中:
在隐式定义类的隐式声明默认构造函数之前,其基类及其非静态数据成员的所有隐式声明的默认构造函数都将被隐式定义。
我所了解的是:
隐式声明的默认构造函数是在创建对象时隐式定义的。
以上的陈述是什么意思?如果基类包含显式默认构造函数,则派生类不能具有隐式默认构造函数?请澄清,如果有人提供了一段示例代码,那就更好了。
发布于 2012-07-20 13:00:56
假设您有类Base和Derived (这是从基派生的)。
让我们假设它们都隐式声明了默认构造函数。当您创建Derived类的对象时,将发生以下情况。首先,将为Base类定义隐式声明的默认构造函数。之后,Derived类的隐式声明构造函数也会发生同样的情况。
这完全是有意义的,因为当您创建Derived类的对象时,首先调用Base类的构造函数。如果那个时候还没有定义的话,那么可能会发生一些不好的事情。
同样的情况也适用于任何具有此类构造函数的类成员:这些构造函数是在定义类的构造函数之前定义的。
发布于 2012-07-20 13:02:29
该语句意味着,当编译器必须为隐式声明的默认构造函数(即当此类构造函数被odr使用时)提供定义时,在之前,编译器必须确保当前构造函数的定义是默认的,为此,编译器可能需要隐式定义成员的任何隐式默认构造函数。
举个例子:
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()。
https://stackoverflow.com/questions/11579853
复制相似问题