C++ 默认构造函数的构建
C++新手学习的时候经常会有两个误区:
- 如果类没有构造函数,编译器会自动添加一个默认构造函数。
- 编译器合成出来的默认构造函数会初始化类数据成员。
编译器并非总是会合成默认构造函数的。根据C++文档的说明:
如果没有任何用户定义的构造函数,那么会有一个默认构造函数会被暗中声明出来。
但是合成的默认构造函数是分为trivial和nontrivial 的,trivial的其实就是没有添加,只是在概念上拥有一个tirvial构造函数。nontirivial的才是真正做实事的。当一个类没有任何构造函数时,默认构造函数会在以下4中情况下合成出来,也就是nontrivial构造函数(符合构造函数必定会被调用的C++语义)。
- 某个数据成员中带有默认构造函数。
- 继承于带有默认构造函数的基类。
以上两点容易理解,无论是成员量的还是继承的构造函数,C++保证会被调用,而这些工作只能放在类初始化的时候做,如果该类没有任何构造函数,则只能由编译器合成一个构造函数,并在其中插入调用该数据成员构造函数的代码。
- 带有virtual 函数的类
存在虚函数分为两种情况,一种是类申明虚函数,一个是派生链中存在虚函数。
若要理解为何会有默认构造函数合成,首先要理解虚函数的实现。
如果一个类中有虚函数,那么虚函数表会被生成出来,里面存放虚函数的地址。
在类中会安插一个指向虚表的指针,以便实现C++的动态语义,而该指针的赋值是在构造函数中完成的,所以需要一个构造函数。
- 虚继承
钻石继承中,会在子类中合成一个指向基类的指针(参考钻石继承的原理),这种情况下也会合成默认构造函数。

浙公网安备 33010602011771号