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的异常处理。