C++黑马教程阶段3 学习笔记
该文章为 学习C++黑马教程阶段3的 原创笔记
教程跳转
1. 函数模板
模板是一种框架,它可以用来创建 泛型函数(函数模板)和 泛型类(类模板);其实我一般更喜欢叫 模板函数 和 模板类,因为他们本质上还是函数或者是类;
为什么要用泛型,之前不同的对象实现相似的功能,我们采取函数重载的形式;但是函数重载的代码还是比较臃肿,而且有很多重复;
所以我们考虑直接用模板,将这些函数重载直接统一写成一个模板函数;然后调用的时候在指定传入的参数类型;比如说交换算法,交换整数,浮点数,逻辑都是差不多的,我们可以用模板实现,调用的时候就指定是int还是double;模板函数的使用方式,就是可以显示指定,也可以自动推导,
自动推导有很多问题 1. 必须推导一致才可以使用 2. 不会发生隐式类型转换 3. 如果和普通函数同名,会优先调用普通函数;由此可见有很多安全问题;
个人偏好直接显示指定,省了很多麻烦;模板函数 可以让 内置类型通用化,但是自定义类型还是无法直接通用化;所以这个时候我们采用模板重载,用 具体化模板 来让自定义类型通用化;
2. 类模板
- 模板类 一般用 class,函数模板 一般用 typename;
- 模板类 也是一种类,我们可以利用模板类实例化出对象,这个对象怎么传参呢,函数调用的时候是直接传入对象,然后接收的时候,可以直接按传入的类型接收;也可以将模板类对象里的参数 模板化;也可以直接模板类对象的类 模板化;
- 当一个类 继承模板类的时候 要注意子类必须指定出父类T的类型,如果不想指定,子类也必须是模板类;
- 模板类的成员函数 也可以类外实现,基本和之前的普通类的操作差不多,唯一区别就是 定义前要加上模板参数列表
- 模板类的分文件编写会出问题,原因是 我们对于普通的类分文件编写,然后在其他文件导入头文件,
普通类的成员函数是编译阶段就会创建;编译阶段,这些函数被创建出来,编译器可以看到这些函数,然后链接的时候把源文件链接上去;
但是模板类的成员函数,只有在调用阶段才会创建,所以编译阶段,这些函数没有被创建出来,编译器是看不到这些函数的;所以链接的时候没有把源文件里这些函数的实现链接上去
最后就会导致无法解析的符号命令错误;
解决方法 自然就是要让编译器可以看到函数的实现代码;1. 直接导入源文件(不推荐,不规范)2.对于模板类 不采取份文件编写,直接写在一起然后保存为.hpp文件(约定俗成);
3. STL
STL这个板块,还是有一些难度的,这里刚入门主要就是关注,一些基本的概念还有项目中会用到的一些特性;
- STL就是标准模板库,是C++的一个库,里面封装了很多模板类,有六大组件,容器,算法,迭代器,仿函数,适配器,空间配置器;
- 容器 就是存储数据,里面设计了很多模板类,为什么要这样做,因为这样我们建立出的数据结构 可以 处理通用类型,而不是像以前一样只能处理单一的数据类型;
例子:如果不用模板,就会导致 如果我们要设计一个数组类,里面对于每一个不同的类型,我们都要函数重载,然后去实现类似的功能;
如果使用模板类,我们直接建一个 数组模板类,然后利用泛型,对于所有类型实现数组的功能,这样的代码复用性高; - vector容器,有两个变量,一个是capacity,一个是size,因为动态扩展机制,所以size 永远小于 capacity,动态扩展就是当容器实际大小 逼近 容量的时候,就会自动扩展容量,方便之后的插入;
我们要注意,动态扩展实质上是开辟新空间,把原数据copy过去,所以是有资源消耗的,我们要尽量减少动态扩展的次数;
如果我们可以确定 数据总量,那我们可以利用reverse()函数直接指定容量,这样就可以不需要动态扩展了;
eg: 插入10万个数,可能需要几十次动态扩展,效率受到了影响;直接reverse(100000)就可以不需要动态扩展了; - 迭代器,可以理解为指针把,指向容器的对象;
- 仿函数 是 STL很重要的一个组件;什么是仿函数呢,仿函数 实际 就是一个重载了函数调用运算符的类对象;然后仿函数在使用的时候,形式和写法很像函数调用,所以我们叫做仿函数 或者 函数对象;
个人习惯叫仿函数;如何使用仿函数呢
首先我们要定义一个仿函数类,然后创建一个仿函数(可以是实例化出的对象,也可以是临时对象,一般用临时对象);
STL里封装了很多 仿函数类模板类;这里统一以下术语;仿函数是对象,创建仿函数的类我们叫仿函数类,然后如果这个类用了模板 我们就叫仿函数类模板;
主要是 算术仿函数类模板,逻辑仿函数类模板,关系仿函数类模板;用的最多的是关系仿函数类模板,可以用来自定义排序;
其他参考资料:《STL源码剖析》第7章 仿函数(函数对象)和配接器 - 算法方面,
是STL里一个很大的库,理解难度不大,主要是运用,感觉这些随用随查就行;常用的自然会记得;
C++黑马教程阶段3 学习笔记
https://vendestine.com/c++-heima-note-level3