C++何时会帮忙合成default constructor

31 篇文章 ¥19.90 ¥99.00
C++新手常误以为任何class都会被合成default constructor,实际上并非如此。编译器仅在4种特定情况下,且class自身未定义default constructor时帮忙合成:1. 成员变量有default constructor;2. 基类有default constructor;3. 类包含虚函数;4. 类有虚拟基类。编译器合成的构造函数仅满足基本需求,不初始化所有值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看《深度探索C++对象模型》,学到了很多东西。。。

C++新手一般有两个常见的误解:

1.任何class如果没有定义default constructor,就会被合成出一个来。

2.编译器合成出来的default constructor会显示设定“class 内每一个data member的默认值”

注意:以上两个说法都是错误的!


编译器只会在以下4种情况,并且class自身没有定义default constructor的情况下,帮忙合成default constructor.

1."带有default constructor"的member class object

也就是说,虽然class A没有显示定义default constructor,但是A class内的成员变量B,B本身是提供显示的default constructor的,这种情况下会为A构造一个default constructor.在该构造函数里会调用B的构造函数,当然只有在被调用的时候才会被合成出来。


2.“带有default constructor"的base class.

也就是说,虽然class A没有显示定义default constructor,但是A class 继承自B class,B本身是提供显示的default constructor的,这种情况下会为A构造一个default constructor.


3.“带有一个virtual function"的class.

也就是说,虽然class A没有显示定义default constructor,但是A class 内有虚函数,既然有虚函数,那么在初始化对象的时候,需要初始化其中的指针vptr指向vtable,所以这种情况下会为A构造一个default constructor.


4.“带有一个virtual base class" 的class

即下面这种情况:

  1. class X
  2. {
  3. public: int i;
  4. };
  5. class A: public virtual X
  6. {
  7. public: int j;
  8. };
  9. class B: public virtual X
  10. {
  11. public: int d;
  12. };
  13. class C: public A, public B
  14. {
  15. public:
  16. int k;
  17. }

这种情况下,编译器会为A,B,C合成default constructor,理由是derived class中都有指针指向virtual base class,需要初始化该指针。


同时需要注意,只有再必要的时候编译器才会合成出来,如程序中逗没建该class的对象,故编译器肯定也不用合成出来。

另外,编译器合成出来的,只是为了满足编译要求,只对那些必要的值进行初始化,不会初始化所有值,初始化所有值这是满足程序员要求了。。。编译器没那么勤奋,而且也不知道其他值该初始化成什么值。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值