博览网 侯捷老师C++课程 第五周笔记
来源:互联网 发布:中老年服饰淘宝模特 编辑:程序博客网 时间:2024/05/07 13:28
对象模型 关于vptr和vtbl
- 虚指针和虚表,一个类的对象内存占用什么样的内存?当一个类有虚函数的时候,对象里面就会多一个指针。一个虚函数和一万个虚函数是一样的。
- 继承会把成员变量继承也会把函数继承下来。
- 一般的函数和虚函数区别。
- 虚拟表中存放的都是指针,虚函数指针。
- 编译器看见调用虚函数时,采用动态绑定。通过虚指针,查看虚表,再看调用的是哪一个函数。(普通函数调用采用动态绑定)
(* p->vptr[n])(p);
编译器会找到n的位置编号。 - 静态绑定 call cll……
- 动态绑定,条件1、通过指针调用;2、指针是向上转型 up case;3、调用的是虚拟函数。(多态)
关于this
- 模板方法,this指针的使用场景。会把当前对象当做this指针传到方法里面。一个父类的方法A里面调用了一个虚函数,这个虚函数在子类中重载,这样当子类调用父类的方法A时,会通过父类的A函数,调用子类重载过的虚函数。
- 所有的成员函数都隐藏了一个this参数。
关于 Dynamic Binding
- 非指针调用不会产生动态绑定。
- 通过指针找到虚指针,找到虚表,找到相应的函数地址。
关于const
- 当成员函数的const和non-const版本同事存在是,const object只会(只能)调用const版本,non-const object只会(只能)调用non-const版本。
- const object 调用const 成员函数可行,但是non-const成员函数不可行。
- non-const object 可以调用 const 成员函数,non-const 成员函数。
- non-const 成员函数可以调用const 成员函数,反之则不行。
关于New 和 Delete
- new 先分配 memory,再调用ctor。
- delete 先调用dtor,再释放memory。
- array new,一定要搭配 array delete。
重载 new 和 delete 全局函数(编译器调用)
重载全局 ::new ::new[] ::delete ::delete[]
- inline void* operator new(size_t_size){……分配内存}
- inline void operatpr delete(void* ptr){……释放内存}
- 上面的重载函数不能放在namespace中,是全局的函数,影响是非常大的。
重载成员函数 new 和 delete
- 成员函数 void* operator new(size_t);
- 成员函数 void operator delete(void*, size_t);
- 成员函数 void* operator new[](size_t);
- 成员函数 void operator delete[](void*, size_t);
- 调用函数时添加了::,调用全局的函数,绕过类所定义的new和 delete版本。
- 关于new 和new[]参数的大小。有虚函数的对象对多一个指针的大小4。
- 对象数组[],对多一个4字节的区域,记录数据的大小是多少。
- 我们可以重载类成员的operator new(),写出多个版本,前提是每个版本的声明都必须有独特的参数列,其中第一个参数必须是size_t,其余参数以new 所指定的placement arguments为初值。出现于new(……)小括号内的便是所谓placement arguments。
- 我们也可以重载类成员operator delete(),写出多个版本,但是绝对不会被delete调用。只有当new所调用的ctor抛出异常,才会调用这些重载的函数operator delete()。它们只能这样被调用,主要用来归还还未完全创造成功的object所占用的memory。即使operatordelete(……)未能一一对应operator new(……)。也不会出现任何报错。
标准库中String使用 new(extra)扩展
- string采用new(extra)进行自己的内存分配,用于实现特定内存结构中引用计数的处理。
0 0
- 博览网 侯捷老师C++课程 第五周笔记
- 博览网 侯捷老师C++课程 第四周笔记
- 博览网C++课程 第五周
- 【博览网】C++标准库——第五周课程笔记
- 博览网 c++课程 第二周课程笔记
- 【博览网】设计模式——第二周课程笔记
- Boolan博览网C++开发课程第二周笔记
- Boolan博览网C++开发课程第三周笔记
- 博览网C++课程 第二周
- 博览网C++课程 第三周
- 博览网C++课程 第六周
- 【博览网】面向对象高级编程(上)——第二周课程笔记
- 【博览网】面向对象高级编程(上)——第三周课程笔记
- 【博览网】面向对象程序设计(下)——第二周课程笔记
- 【博览网】C++标准库——第二周课程笔记
- 【博览网】C++标准库——第三周课程笔记
- 【博览网】设计模式——第一周课程笔记
- Boolan博览网C++开发课程第一周笔记
- Vue项目搭建
- linux error: expected declaration specifiers or '...' XXX
- Ant Counting POJ - 3046 多重集组合数
- Web项目程序怎么发布部署
- 求FFFF:0到FFFF:F的字节型数据和,存放到dx中(LOOP和ds:[bx]联合运用)
- 博览网 侯捷老师C++课程 第五周笔记
- 把有交互功能的UI显示出来
- 学习BLAS库 -- TRMV
- S2 深入.NET平台和C#语言 第三章 课上练习
- 一、策略模式
- 信号量Semaphore
- 95. Unique Binary Search Trees II -Meidum
- 3.CSS图像绘制之:三角图标
- 图像分类问题与成像回归问题的异同