C++对象构造与析构全流程

对象构造流程

1. 首先,如果有virtual base class constructors,虚基类的构造函数必须被调用,从左往右,从深往浅:

-> 如果有virtual base class constructor位于成员初值列,有任何显示指定的参数都应该传递过去;若没有位于初值列,而virtual base class含有一个默认构造函数,也应该调用。

-> class中的每一个virtual base class subobject的偏移量必须在执行期可被存取。

->  用以支持virtual base class在一个完整对象中只初始化一次的机制,必须被放进来。

2. 其次,如果其base class有构造函数,base class的构造函数必须被调用;

-> 如果base class的构造函数位于成员初值列,有任何显示指定的参数都应该传递过去。

-> 若没有位于初值列,而base class含有一个默认构造(拷贝)函数,也应该调用。

->  如果class是多重继承下的第二或者后继的base class,那么this指针应该有所调整。

3. 如果有虚函数,需要在构造函数中设定vptr指向适当的虚表,基类的vptr在基类构造函数中设定,子类vptr在子类构造函数中设定;

4. 如果一个member没有出现在成员初值列表中,但是该member有一个默认构造函数,那么这个默认构造函数必须被调用;

5. 成员初值列表中的member初始化操作放在constructor的函数体内,且顺序和声明顺序一致。

6. 执行构造函数体中的代码。

 

对象析构流程:

1. destructor的函数体首先执行。

2. 如果class拥有member class object,且该class含有destructor,那么它们会以声明顺序相反的顺序依次被调用。

3. 如果object内含一个vptr,重新被设定指向适当的base class的virtual table。

4. 如果有任何上层的nonvirtual base classes拥有destructor,那么它们会以声明顺序相反的顺序依次被调用。

5. 如果有任何virtual base classes拥有destructor,那么它们会以原来构造顺序相反的顺序依次被调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值