C++对象模型之默认构造函数的构造操作,拷贝构造函数同

一个类,如果没有任何的用户声明的的构造函数,那么会有一个默认的构造函数被隐式地声明出来。这个被隐式声明的构造函数,究竟什么时候被合成、被编译器合成的默认构造函数究竟执行怎么样的操作,编译器如何处理用户定义的构造函数,见下:

1)类的成员变量带有默认构造函数 (带有default constructor的member class object),合成的default constructor调用了成员对象的构造函数。

2)类的基类带有默认构造函数,同上,编译器会合成default constructor 调用基类的default constructor 或者扩展现有的每一个constructor,并且在成员对象默认构造函数调用之前。

3)类带有virtual函数 

合成default constructor在对象的开头写入vptr(虚表指针)用于实现多态;

当用派生类对象复制初始化一个基类对象,他的虚表指针必须得到正确的赋值,而不能使用bitwise,所以default copy constructor必须被合成出来

4)类带有一个virtual基类

对象中有一个virtual base class subobject的指针(这个不同编译器的实现方式不同,有的是virtual base class table,有的是在虚函数表中写入virtual base class的offset,总之需要default constructor和default copy constructor实现,并在用户定义的构造函数添加代码。 

满足上述4种情况之一或以上的类,若没有声明任何的构造函数,编译器会为其合成一个默认的构造函数;若已声明一个或多个构造函数,则编译器会为每个构造函数安插一定的代码来完成编译必要的工作。这些被合成的构造函数称为implicit nontrivial default constructors(隐式有效的默认构造函数)。

默认构造函数在需要被调用时被合成出来,并且在不同的编译模块用inline方式避免合成多个default constructor



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值