博览网C++课程 第五周

17 对象模型:关于vptr和vtbl

虚指针和虚表,代码层次无法看到。

例如现在有个继承关系:



只要类中有一个虚函数,就存在一个指针,1万个虚函数也是这个一个指针。

这个指针指向的时一个虚表,虚表中存放的都是函数指针,指向虚函数所在的位置。



对于子类来说,函数继承父类的使用权,而不是大小。

 

18 对象模型:关于this

类中有个隐藏的this指针。(*(this->vptr)[n])(this),动态绑定,通过虚表查找函数地址:


 

19 对象模型:关于Dynamic Binding

对象不是new出来的,虚函数调用时使用静态绑定。


通过指针访问(new),虚函数调用时使用动态绑定:


20 谈谈const

const object使用const 函数,√

const object使用non-const 函数,×

non-const object使用const 函数,√

non-const object使用non-const 函数,√

 


程序要尽可能的加const,举例:


如果print是non-const函数,那么编译时会出错。

当成员函数有两种版本时“const”和“non-const”时,const object只能使用const版本,non-const object只能使用non-const版本。

21 关于New,Delete

New和Delete内部实质使用了malloc和free,可以重载,改写。

 

22 重载Operator new,Operator delete

基本造型:

 

 

23 示例

若开发者不想使用类中写好的new和delete,可以使用:

 

new出来的class的数组,占用内存是class大小 x N + 4,“4”这个32位空间用来存储class的数量,,newFoo[5],调用5次构造函数,-如下:

 

 

24 重载new(),delete()$示例

具有“小括号”的new,叫做placement new。



new可以有很多版本,但是第一个参数必须是size_t。


 

delete也可以重载,写出多个版本,但是决不会被delete调用,只有当new所调用的构造函数ctor抛出exception时,才会调用这些重载版本的operatordelete()。

即使重载delete未能与重载new一一对应,也不会出现报错,此时编译器放弃ctor的异常处理。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值