1.对象模型:关于vptr和vtbl
. 虚指针和虚表
. 类中对象如何占用内存,和成员数据有关系,若B继承了A,则B中包含A所有成员再加上自己
. 子类对象包含所有父类成分
. 存在继承关系,一定会有虚指针
. 函数的继承,是继承的调用权而不是内存大小
. 每一个虚函数在虚指针所指向虚表中各有一个自己的指针所指向
. 通过指针调用虚函数时候,不做静态绑定.
. 虚函数的这种用法,叫做多态
2.对象模型:关于this
. 分析继承体系时,一定要很清楚this
. 通过对象调用函数时,对象的指针就是this
. 使用虚函数时候,有两种形式用法,多态和模版方法
. 在MFC库中有很多这种栗子
. 通常父类会写好各种功能,子类的对象调用父类的函数
. 面向对象在使用虚函数的过程
3.对象模型:关于dynamic binding
. 通过编译码来观察静态绑定
. 汇编码动态绑定的观察
4.const
. 常量成员函数,const放在函数小括号和花括号中间
. 成员函数不改变class data类数据
. 在对象调用常量或者非常量函数时,对象有可能是const也可能不是const
. c++中很多规则都是基于其内部原理
. const属于signature的一部分
. 设计数据共享情况的时候一定要考虑各方改动数据的影响,改动前需先copy on write
. 如果调用中括号的是常量字符串,则不需要做copy on write,因为常量字符串不会被修改
5.new delete
. new和delete在使用时都为表达式,这个行为不能改变,但其所调用函数可以重载
. new在底层调用malloc
6.重载operator new operator delete
. 在全局范围重载,重载后的operator接管new和delete操作
. 重载在这里影响非常广
. 也可以在class中对一个成员进行重载
. 接口和前一致
. optional部分是可选的
. 重载后,接管内存分配释放
. 重载成员函数中带[]的new和delete
. 进行对一个数组的new和delete操作的接管
7.重载示例、接口
. 使用者在使用时候有可能会绕过成员中重载的new来调用全局的new
. 观察执行的结果
. 当类中有虚函数时,类中会多出一个虚指针
. 数组在创建时,每个数据都要调用构造函数一次
. array前会多一个counter
. 观察使用在绕过成员重载使用全局new的情况
8.重载new()、delete()
. new可以有多个版本,每个版本placement含有其独特的参数列
. 用小括号表现出来的额外参数来区分版本
. 第一个参数必须是size_t
. 也可以重载其相对应的版本
. 将new()接管
. 观察报错信息也是一个很好的学习过程
. 重载参数相对应
. 被调用的时机是在分配内存后调用构造函数发出异常时,有机会释放之前分配异常的内存
. 在异常发出后,如果没有被处理,则会terminate
. 不同编译器对其处理方法不一样
9.标准库中的一个栗子
basic_string使用new(extra)扩充申请量
. reference counting的设计
...