析构语意学(Semantics of Destruction)

如果class没有定义destructor,那么只有在class内含的member object(或class自己的base class)有拥有destructor时,编译器才会自动合成一个出来。否则,destructor被视为不需要,也就不需要合成(当然更不需要调用)

1.

1.如果object内含一个vptr,那么首先重设相关的vtbl。
2.destructor的函数体被执行,vptr会在程序员的代码之前被重设。
3.如果class拥有member class objects,而后者拥有destructors,那么它们会以其声明顺序的相反顺序被调用。
4.如果任何直接的(上一层)nonvirtual base classes拥有destructor,它们会以其声明顺序的相反顺序被调用。
5.如果有任何的virtual base classes拥有destructor,目前这个class是最尾端(most-derived)的class,那么它们以其原来的构造的相反顺序被调用。

2.

一个object声明结束期destructor开始执行之时。由于每个base class destructor被轮番调用,所以derived object实际上变成了一个完整的object。例如一个PVertex对象归还内存空间前,会依次变成一个Vertex3d对象、一个Vertex对象,一个Point3d对象,最后变成一个Point对象。当我们在destructor中调用member function时,对象对象的蜕变会因为vptr的重设(在每一个destructor中,在程序员所提供的代码执行之前)而受到影响。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值