如果我没有在C ++或任何其他构造函数的类中定义默认构造函数,我已经读过编译器为您创建一个默认构造函数。但是我创建了一个测试类,将其编译为汇编代码并进行检查以发现没有创建任何类型的测试类 有人可以澄清如何创建默认构造函数的代码,或者它是否首先创建?
答案 0 :(得分:6)
如果需要,创建默认构造函数,例如:
class Foo {
std::string s;
};
...
Foo f;
12.1:
默认构造函数(12.1),复制 构造函数和复制赋值 运算符(12.8)和析构函数(12.4) 是特殊的会员功能。该 实现将隐式声明 这些成员函数用于类 当程序没有时输入 显式声明它们,除了 在12.1中提到。实施将 隐含地定义它们,如果它们是 使用,如12.1,12.4和 12.8。
此外,如果您的类不需要在构造函数中完成任何操作,编译器可能会选择不生成代码,即使按标准构造函数应该存在。
答案 1 :(得分:2)
以下是C ++ 03标准所说的内容:
§12.1/ 5:
类X的默认构造函数是类X的构造函数,可以在没有参数的情况下调用。如果类X没有用户声明的构造函数,则隐式声明默认构造函数。隐式声明的默认构造函数是其类的内联公共成员。如果构造函数是隐式声明的默认构造函数,并且如果:
,则构造函数是微不足道的
- 其类没有虚函数(10.3),没有虚基类(10.1)和
- 其类的所有直接基类都有简单的构造函数和
- 对于类类的所有非静态数据成员(或其数组),每个这样的类都有一个简单的构造函数。
§12.1/ 6:
否则,构造函数是非常重要的。
§12.1/ 7:
当用于创建类类型(1.8)的对象时,会隐式定义类的隐式声明的默认构造函数。隐式定义的默认构造函数执行该类的初始化集合,该初始化集合将由用户编写的具有空mem-initializer-list(12.6.2)和空函数体的类的默认构造函数执行。如果用户编写的默认构造函数不正确,则程序格式错误。在隐式定义类的隐式声明的默认构造函数之前,必须隐式定义其基类及其非静态数据成员的所有隐式声明的默认构造函数。 [注意:隐式声明的默认构造函数具有异常规范(15.4)。]
这意味着对于具有隐式声明的但未隐式定义的默认构造函数的类,或者对于具有隐式定义的普通默认构造函数的类,可能不需要生成代码。
答案 2 :(得分:1)
C ++!=汇编。
汇编是(一种可能的)输出,用于编译的C ++程序,它可能包含或不包含某些优化,这些优化可能已经将调用省略为可能为空的构造函数。
换句话说,语言说有一个默认构造函数,但它只描述行为,而不是实现。如果一个实现感觉它不需要生成代码,那就不必。
答案 3 :(得分:1)
您是否想询问您的编译器是否实际为默认构造函数发出代码?
这取决于优化。大多数现代编译器在与-O0一起使用时会发出默认的构造函数代码序列,但是如果它未被使用并且你使用-O2或更高版本,它将优化它。