GeekBand极客班C++面向对象高级编程(下)第二周笔记

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

. 虚指针和虚表

. 类中对象如何占用内存,和成员数据有关系,若B继承了A,则B中包含A所有成员再加上自己

. 子类对象包含所有父类成分

. 存在继承关系,一定会有虚指针

. 函数的继承,是继承的调用权而不是内存大小

. 每一个虚函数在虚指针所指向虚表中各有一个自己的指针所指向

. 通过指针调用虚函数时候,不做静态绑定.

. 虚函数的这种用法,叫做多态

GeekBand极客班C++面向对象高级编程(下)第二周笔记_第1张图片

2.对象模型:关于this

. 分析继承体系时,一定要很清楚this

. 通过对象调用函数时,对象的指针就是this

. 使用虚函数时候,有两种形式用法,多态和模版方法

. 在MFC库中有很多这种栗子

. 通常父类会写好各种功能,子类的对象调用父类的函数

. 面向对象在使用虚函数的过程

GeekBand极客班C++面向对象高级编程(下)第二周笔记_第2张图片

3.对象模型:关于dynamic binding

. 通过编译码来观察静态绑定

GeekBand极客班C++面向对象高级编程(下)第二周笔记_第3张图片

. 汇编码动态绑定的观察

4.const

. 常量成员函数,const放在函数小括号和花括号中间

GeekBand极客班C++面向对象高级编程(下)第二周笔记_第4张图片

. 成员函数不改变class data类数据

. 在对象调用常量或者非常量函数时,对象有可能是const也可能不是const

GeekBand极客班C++面向对象高级编程(下)第二周笔记_第5张图片

. c++中很多规则都是基于其内部原理

. const属于signature的一部分

. 设计数据共享情况的时候一定要考虑各方改动数据的影响,改动前需先copy on write

. 如果调用中括号的是常量字符串,则不需要做copy on write,因为常量字符串不会被修改

5.new delete

. new和delete在使用时都为表达式,这个行为不能改变,但其所调用函数可以重载

. new在底层调用malloc

6.重载operator new operator delete

. 在全局范围重载,重载后的operator接管new和delete操作

. 重载在这里影响非常广

GeekBand极客班C++面向对象高级编程(下)第二周笔记_第6张图片

. 也可以在class中对一个成员进行重载

. 接口和前一致

. optional部分是可选的

. 重载后,接管内存分配释放

GeekBand极客班C++面向对象高级编程(下)第二周笔记_第7张图片

. 重载成员函数中带[]的new和delete

. 进行对一个数组的new和delete操作的接管

GeekBand极客班C++面向对象高级编程(下)第二周笔记_第8张图片

7.重载示例、接口

. 使用者在使用时候有可能会绕过成员中重载的new来调用全局的new

. 观察执行的结果

. 当类中有虚函数时,类中会多出一个虚指针

. 数组在创建时,每个数据都要调用构造函数一次

. array前会多一个counter

. 观察使用在绕过成员重载使用全局new的情况

GeekBand极客班C++面向对象高级编程(下)第二周笔记_第9张图片

8.重载new()、delete()

. new可以有多个版本,每个版本placement含有其独特的参数列

. 用小括号表现出来的额外参数来区分版本

. 第一个参数必须是size_t

. 也可以重载其相对应的版本

GeekBand极客班C++面向对象高级编程(下)第二周笔记_第10张图片

. 将new()接管

. 观察报错信息也是一个很好的学习过程


. 重载参数相对应

. 被调用的时机是在分配内存后调用构造函数发出异常时,有机会释放之前分配异常的内存

. 在异常发出后,如果没有被处理,则会terminate

. 不同编译器对其处理方法不一样

9.标准库中的一个栗子

basic_string使用new(extra)扩充申请量

. reference counting的设计



...

你可能感兴趣的:(GeekBand极客班C++面向对象高级编程(下)第二周笔记)