8. 对象模型:关于 vptr 和 vtbl
对象模型:关于 vptr 和 vtbl有虚函数,就会多一个指针vptr,数据多4byte。
继承函数继承的是调用权
继承数据
父类有虚函数,子类一定有。
虚表 virtual table
vptr 指向 vtbl
vtbl 里面有指针指向虚函数
c 里面调用函数,会 call 然后 return,这叫静态绑定
而有虚函数,会动态绑定
(* (p->vptr)[n])(p);
(* p->vptr[n])(p);
符合三个条件就会使用上面这个动态绑定的形式。
- 通过指针来调用
- 指针必须向上转型 upcast(类型是父类指针)
- 调用的是虚函数
动态绑定要看 p 指向的是什么。
右下角这种模式叫做“多态”,可以指向多种类的对象。
list<A*> myLst;
9. 对象模型(Object Model)
9.1 关于 this
关于 thisthis 是一个指针
这种用法叫做 Template Method
虚函数的用法主要有两种,这个和多态。
子类可以调用父类的函数
9.2 关于 Dynamic Binding
关于 Dynamic Binding Paste_Image.png对象调用,必然是静态绑定
10. 谈谈 const
谈谈 constdouble real () const { return re ; }
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
new,deletenew 有三个动作
传进来
重载
malloc
class 是可以重载 new 和 delete 的。
11.1 重载 ::operator new, ::operator delete,::operator new[],::operator delete[]
重载 ::operator new, ::operator delete影响层面非常广,因为重载的是全局。
11.2 重载 member operator new/delete
重载 member operator new/deletedelete 的第二个参数size_t是可选的。
重载 member operator new[]/delete[]
重载 member operator new/delete传进来的 size_t 和前面大小不一样。
11.2.1 示例,接口
示例,接口可以强制调用 globals
Foo* pf = ::new Foo;
::delete pf;
示例
示例中括号数组的版本,值得注意的地方
int 4
long 4
string 里是一个指针,也是4
虚函数就有虚指针,4
学会用 sizeof()
建立数组,每个都要调用一次构造函数。
第一个值记录数组大小,值是5。counter 计数器。
示例
示例11.3 重载new(),delete()
重载new(),delete()我们可以重载 class member 的 operator new()
可以写出多个版本,但是每个版本的参数列不能相同。
我们也可以重载 class member 的 operator delete()
但是不会被 delete 调用,只有……
即使 delete() 与 new() 没有一一对应,编译器也不会报错。
12. Basic_String 使用 new(extra)扩充申请量
当我们想无声无息的添加一些内容的时候,可以使用这种形式。
Basic_String 使用 new(extra)扩充申请量
网友评论