第二周(Geek Band)

对象模型

1、vptr和vtbl(虚函数与虚表)

调用虚函数vfun,通过虚指针vptr找到虚表vtbl,通过虚表指向虚函数位置实现调用。

第二周(Geek Band)_第1张图片
内存模型
第二周(Geek Band)_第2张图片
以PPT内绘制图形为例
第二周(Geek Band)_第3张图片
多态

2、this(this指针)

虚函数的应用场景,template method。

第二周(Geek Band)_第4张图片
Template Method实现过程
第二周(Geek Band)_第5张图片
this指代子类对象
第二周(Geek Band)_第6张图片
动态绑定/多态

3、Dynamic binding(动态绑定)

第二周(Geek Band)_第7张图片
静态绑定
第二周(Geek Band)_第8张图片
动态绑定

pa指针,new的是B类型的对象,向上转型为A,调用虚函数vfunc1()-------》动态绑定

第二周(Geek Band)_第9张图片
call的结果不同

new &delete


// Global里关于new 和delete的定义

inline void* operator new(size_t size ) {
    size_t* p=(size_t*)malloc(size);
    cout<<"Global::operator new().\tsize="< 
  
第二周(Geek Band)_第10张图片
全局重载
第二周(Geek Band)_第11张图片
new delete 重载解析
第二周(Geek Band)_第12张图片
new【 】 delete【 】重载解析
第二周(Geek Band)_第13张图片
接口设计范例
第二周(Geek Band)_第14张图片
结果显示
第二周(Geek Band)_第15张图片
强制全局new 与delete 调用结果显示
第二周(Geek Band)_第16张图片
重载new() delete()
第二周(Geek Band)_第17张图片
抛出异常示例
第二周(Geek Band)_第18张图片
抛出异常结果测试。显示有可能调用不到此函数

调用不到此函数的原因:1、异常无法处理,回收内存失败。2、可以通过new 与delete 全局回收,不需要写此函数。(个人猜测)

第二周(Geek Band)_第19张图片
标准库中basic_string案例

const 补充

第二周(Geek Band)_第20张图片
成员函数const 位置,表示内容不做修改。

只有成员函数const 才能放在这个位置,表示内容不做修改。一般的全局函数const不能放在这里。

第二周(Geek Band)_第21张图片
const说明

常量(const)对象只能调用常量(cosnt)函数,调用非常量函数会出错。

非常量对象可调用const 函数,也可调用非常量函数。

设计时,能加const的都加const。

const 属于签名的一部分。

第二周(Geek Band)_第22张图片
COW模式
第二周(Geek Band)_第23张图片
常量和非常量同时存在,常对常,非常对非常

你可能感兴趣的:(第二周(Geek Band))