4

我知道如果我们不声明它,编译器会生成一个默认构造函数。

而“何时”是我感到困惑的地方。

A:

class Base {};
int main()
{
    return 0;   
}

乙:

class Base {};
int main()
{
    Base b;   // Declare a Base object.
    return 0;
}

A 和 B 的区别仅在于 B 声明了 Base 的真实对象。在我看来,只有当我们声明一个真实对象并且编译器没有找到构造函数时,它才会生成一个默认构造函数。

我的问题是:

  1. 代码片段A会生成Base的默认构造函数吗?

  2. 有什么工具可以帮助检查结果吗?我使用 Visual Studio 2010,/d1 reportAllClassLayout 似乎没用。

4

2 回答 2

6

引用 C++11。

[class.ctor]§5

类的默认构造函数是可以在没有参数的情况下调用X的类的构造函数。X如果 class 没有用户声明X的构造函数,则没有参数的构造函数被隐式声明为默认值 (8.4)。

[class.ctor]§6

一个默认的且未定义为已删除的默认构造函数在被 odr 使用 (3.2) 创建其类类型 (1.8) 的对象时或在其第一次声明后显式默认时被隐式定义。

这意味着它是在定义您的类时声明的,并inline在它第一次在给定的翻译单元中使用时定义(as)。

在您的情况下,这意味着代码片段A将包含默认构造函数的声明(但不是定义),而片段B将包含两者。

于 2013-10-13T16:58:35.667 回答
3

特殊成员函数(默认构造函数、复制构造函数等)的声明总是作为类定义的一部分发生。Base因此,在声明默认构造函数方面,您的两个示例都是相同的。

一个单独的问题是隐式定义特殊成员函数时。这通常推迟到成员函数的实际 ODR 使用。

于 2013-10-13T16:59:27.260 回答