侯捷老师c++课程笔记 (面向对象高级编程7)

1动态绑定与静态绑定

 把B的对象b强转为A类,那么调用的A的虚函数还是B的虚函数? 这是通过对象来调用,不是通过指针来调用,所以是静态绑定,用call +函数地址来调用,调用的是A的虚函数

  pa->vfunc1() 符合动态绑定的三个条件 1 用指针调用 2 向上转型(父类指针指向子类对象) 3 是虚函数   call+指针

2const关于cow的应用

const:常量对象不能调用非常量函数,这点前面老师说过好几次,出错的时候很难检查出来。 const也算函数签名的一部分:函数重载的时候不看返回值类型,只看函数签名,即参数数量和类型是否一致,如果都一致就不叫重载,叫重名,会报错,但const也算函数签名的一部分,如果参数数量和类型一致,但是一个有const一个没const,也算重载。

string copy 时是共享一个string,但当其中一个要改的时候,会临时copy一个用来写(即copy on write),所以标准库里string必须考虑cow,那么当常量字符串调用[],比如const str[5],那么就不用考虑cow,所以标准库要把这种情况区分开来,这才有了两个重载[]的函数。这样一来常量对象只能调用常量成员函数,但非常量对象可以调用常量成员函数和非常量成员函数,为了避免这种情况,所以c++还有条规则,就是那条灰色框框。

 

 

3重载new delete

::operator new 重载全局的new,风险很大,因为很多其他函数都会用到

根据原来讲的new和delete需要分成三步和两步,下面例子说明了就算重载了new和delete,前面的步骤没变。

4重载new[]和delete[]

 

 蓝色框里如果无成员函数重载的new和delete则调用全局的new和delete,若有则用成员函数重载的new和delete,若调用::new则是强制调用全局的

 每个元素为4(int)+4(long)+4(string)=12个字节,数组元素为5,那么sizeof(Foo)=12x5=60,为什么是64呢,因为分配内存的时候多出了一个大小为4字节记录数组元素个数的内存,如果是虚函数那么就多了根虚指针,每个元素就是16个字节,sizeof()后就是16x5+4=84 ,construct(构造)是从上到下,destruct(析构)是从下到上。

 

5 不同版本的重载new delete

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值