C++中关于生成默认构造函数的4种情况

2100阅读 0评论2021-05-28 stolennnxb
分类:C/C++

先说常见误解:
1. 任何class如果没有定义default constructor,就会被合成出default constructor(如果认为下文当中的non-trivial constructor也算constructor,这条勉强算对)
2. 编译器合成出来的default constructor 会显式设定class内每一个data member的默认值

以上两条都是错的!!!

C++中关于默认构造函数有trivial 和 non-trivial两种分类。 对于class X, 如果没有任何用户自定义的constructor,会有一个constructor被隐式声明出来,一个隐式声明出来的default constructor就是一个trivial的constructor,里面啥也没干,类成员的值,取决于上次用这块内存的遗留数据,或者undefine;与之相对的就是non-trivial 的default constructor,编译器构造的这种constructor实际上是会“背着我们干些事情”的,下面4中情况就会构造出non-trivial 的default constructor
1.  当类成员当中包含有1个或多个“有自定义的default constructor”的对象的时候,这时候编译器作的事情就相当于在它帮我们生成的构造函数当中加上了这(些)构造函数的调用
2. 带有default constructor的base class,原理类似上面
3. 带有virtual function的class,对于含有virtual function的类的对象,编译器必须为每一个类构造出对应的虚函数表,并且为每一个对象的vptr设置好初始值。
4. 带有virtual base class的class, 由于早期C++实现virtual base class 是靠在“derived class object中安插一个指向virtual base class的指针”来完成的,所以,这个指针是需要编译器构造的默认构造函数来进行初始化赋值的~
上一篇:c++对象模型
下一篇:C++当中的copy constructor