第五周 C++面向对象高级编程(下)Boolan

8. 对象模型:关于 vptr 和 vtbl

第五周 C++面向对象高级编程(下)Boolan_第1张图片
对象模型:关于 vptr 和 vtbl

有虚函数,就会多一个指针vptr,数据多4byte。
继承函数继承的是调用权
继承数据
父类有虚函数,子类一定有。
虚表 virtual table
vptr 指向 vtbl
vtbl 里面有指针指向虚函数

第五周 C++面向对象高级编程(下)Boolan_第2张图片
Paste_Image.png

c 里面调用函数,会 call 然后 return,这叫静态绑定
而有虚函数,会动态绑定

(* (p->vptr)[n])(p);
(* p->vptr[n])(p);

符合三个条件就会使用上面这个动态绑定的形式。

  1. 通过指针来调用
  2. 指针必须向上转型 upcast(类型是父类指针)
  3. 调用的是虚函数

动态绑定要看 p 指向的是什么。
右下角这种模式叫做“多态”,可以指向多种类的对象。

list myLst;

9. 对象模型(Object Model)

9.1 关于 this

第五周 C++面向对象高级编程(下)Boolan_第3张图片
关于 this

this 是一个指针
这种用法叫做 Template Method
虚函数的用法主要有两种,这个和多态。
子类可以调用父类的函数

9.2 关于 Dynamic Binding

第五周 C++面向对象高级编程(下)Boolan_第4张图片
关于 Dynamic Binding
第五周 C++面向对象高级编程(下)Boolan_第5张图片
Paste_Image.png

对象调用,必然是静态绑定

10. 谈谈 const

第五周 C++面向对象高级编程(下)Boolan_第6张图片
谈谈 const
double real () const { return re ; }
第五周 C++面向对象高级编程(下)Boolan_第7张图片
Paste_Image.png

const 只能放在成员函数的而后头,全局函数是不能放 const 的。
表示这个成员函数不打算改变 class 的数据。请编译器把关。
如果成员函数没有 const,那么 const object 会无法调用这个成员函数。

COW:Copy On Write
写的时候要先拷贝一份出来
常量字符串不需要考虑 COW
当成员函数的 const 和 non-const 版本同时存在,const object 只会调用 const 版本,non-const object 只会调用 non-const 版本。

11. 关于 new,delete

第五周 C++面向对象高级编程(下)Boolan_第8张图片
new,delete

new 有三个动作
传进来
重载
malloc
class 是可以重载 new 和 delete 的。

11.1 重载 ::operator new, ::operator delete,::operator new[],::operator delete[]

第五周 C++面向对象高级编程(下)Boolan_第9张图片
重载 ::operator new, ::operator delete

影响层面非常广,因为重载的是全局。

11.2 重载 member operator new/delete

第五周 C++面向对象高级编程(下)Boolan_第10张图片
重载 member operator new/delete

delete 的第二个参数size_t是可选的。

重载 member operator new[]/delete[]

第五周 C++面向对象高级编程(下)Boolan_第11张图片
重载 member operator new/delete

传进来的 size_t 和前面大小不一样。

11.2.1 示例,接口

第五周 C++面向对象高级编程(下)Boolan_第12张图片
示例,接口

可以强制调用 globals

Foo* pf = ::new Foo;
::delete pf;

示例

第五周 C++面向对象高级编程(下)Boolan_第13张图片
示例

中括号数组的版本,值得注意的地方
int 4
long 4
string 里是一个指针,也是4
虚函数就有虚指针,4
学会用 sizeof()
建立数组,每个都要调用一次构造函数。
第一个值记录数组大小,值是5。counter 计数器。

示例

第五周 C++面向对象高级编程(下)Boolan_第14张图片
示例

11.3 重载new(),delete()

第五周 C++面向对象高级编程(下)Boolan_第15张图片
重载new(),delete()

我们可以重载 class member 的 operator new()
可以写出多个版本,但是每个版本的参数列不能相同。
我们也可以重载 class member 的 operator delete()
但是不会被 delete 调用,只有……
即使 delete() 与 new() 没有一一对应,编译器也不会报错。

第五周 C++面向对象高级编程(下)Boolan_第16张图片
Paste_Image.png
第五周 C++面向对象高级编程(下)Boolan_第17张图片
Paste_Image.png

12. Basic_String 使用 new(extra)扩充申请量

当我们想无声无息的添加一些内容的时候,可以使用这种形式。

第五周 C++面向对象高级编程(下)Boolan_第18张图片
Basic_String 使用 new(extra)扩充申请量

你可能感兴趣的:(第五周 C++面向对象高级编程(下)Boolan)