我知道如果我们不声明它,编译器将生成一个默认构造函数。
而“何时”是我感到困惑的一点。
A:
class Base {};
int main()
{
return 0;
}
B:
class Base {};
int main()
{
Base b; // Declare a Base object.
return 0;
}
A和B的区别仅在于B声明了Base的真实对象。 在我看来,只有当我们声明一个真实对象并且编译器找不到构造函数时,它才会生成一个默认构造函数。
我的问题是:
代码片段A会生成Base的默认构造函数吗?
是否有任何工具可以帮助检查结果?我使用Visual Studio 2010,而/ d1 reportAllClassLayout似乎没用。
答案 0 :(得分:6)
引用C ++ 11。
[class.ctor]§5
:
类
X
的默认构造函数是类X
的构造函数,可以在没有参数的情况下调用它。如果类X
没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4)。
[class.ctor]§6
:
默认构造函数是默认的,未定义为已删除的隐式定义,当使用odr-used(3.2)创建其类类型的对象(1.8)或明确默认时在第一次宣布之后。
这意味着它在您的类被定义时被声明,并且在它首次在给定的翻译单元中使用时被定义(如inline
)。
在您的情况下,这意味着代码片段A
将包含默认构造函数的声明(但不是定义),而片段B
将包含两者。
答案 1 :(得分:3)
特殊成员函数(默认构造函数,复制构造函数等)的声明总是作为类定义的一部分发生。因此,对于具有声明的默认构造函数的Base
,您的两个示例都是相同的。
另一个问题是特殊成员函数是否隐式定义。这通常推迟到成员函数的实际ODR使用之前。