C++编译器合成Default Constructor的4种情况

本文探讨了C++中编译器合成默认构造函数的四种情况:类包含对象且无默认构造函数、派生类基类有默认构造函数、类有虚函数、菱形继承时。深入解析编译器如何合成构造函数及其对类成员的影响。

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

笔记C++编译器为编译器需要合成Default Constructor的4种情况。

1,Class A内含Class B对象,Class A没有Default Constructor时会在编译时合成Default Constructor

    在编译期间这个Default Constructor会插入调用Class B的Default Constructor的代码 ,如:    

 1 class  B{
 2 public :
 3     B(){}
 4 };
 5 
 6 class A
 7 {
 8 public:                                                                                                                 
 9     B bb ;
10     /*
11     A()
12     {
13        bb.B::B();//合成可以调用bb的构造函数的代码
14     }
15     */
16 };

2,派生类的基类带有默认构造函数,而派生类无显示默认构造函数,编译器会合成派生类的默认构造函数并插入调用按声明顺序的基类的构造函数。

 

3,当类带有virtual function时,无显示构造函数,会合成默认构造函数。编译器会产生virtual table,里面是该class的virtual function的地址,并为每个实例化对象合成一个指向该virtual table的指针。

 

4,菱形继承时,  

                      Base

                   /          \

                child1     child2

                     \        /

                    Derived              child* virtual 继承 Base,Derived 没有显示构造函数时,编译器会为Derived合成默认构造函数。会产生一个指向Base的指针。

 

 

* 并不是每个没有显示构造函数的类编译器都会为其合成默认构造函数,只有当默认构造函数有一定用处时,才会为编译所需合成Default Constructor

* 编译器合成的默认构造函数只为有用而合成,对于class 的 data member不会初始化,初始化工作只是程序员的事情。

转载于:https://www.cnblogs.com/dot-dot-123/p/4103312.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值