Inside The C++ Object Model(五)构造、拷贝、析构语意学

一 对象构造:

(一)“无继承”情况下的对象构造

(二)“继承下”的对象构造

(三)vptr初始化语意学:

1.在一个class的constructor中,经由构造中的对象调用一个virtual function,其函数体应该是在此class中的那个virtual function版本。

2.决定一个类的virtual functions名单的关键是:virtual table。

*virtual table如何被处理:通过vptr。

*控制一个class中所用的函数,编译器只要简单的控制住vptr的初始化和设定操作即可。

3.vptr在constructor中应该何时被初始化:

*在base class constructor调用操作之后,但是在程序员提供的代码或是member initialization list中所列的members初始化操作之前。

4.constructor的执行步骤:

*在derived class construcot中,所有virtual base classes及上一层base class的constructors被调用;

*上述完成之后,对象的vptr(s)被初始化,指向相关的virtual table(s)。

*如果有member initialization list的话,将在constructor内扩展开来。这必须在vptr被设定之后进行,以免有一个virtual function被调用。


二 对象复制语意.


三 对象功能.


四 对象析构:

(1)编译器自动合成析构函数的情况(如果存在的则编译器扩展现有的destructor):

*class没有定义destructor,并且class内含的member object拥有destructor。

*class没有定义destructor,并且class的base class拥有destructor的情况下。

*注意:即使拥有虚函数,编译器也不自动合成destructor。

(2)destructor的执行步骤:

*destructor的函数本身先被执行。

*如果class拥有member class objects,而后者拥有destructors,那么它们会以其声明顺序的相反顺序被调用。

*如果object内带一个vptr,则现在被重新设定,执行适当的base class的virtual table。

*如果有任何直接的nonvirtual base classes拥有destructor,则以声明顺序的相反顺序被调用。

*如果有任何的virtual base classes拥有destructor,而当前的这个class是最尾端(most-derived)的class,那么它们以声明顺序的相反顺序被调用。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值