目录
一、模版的概述
c++ 面向对象编程 思想:封装、继承、多态
c++ 泛型编程 思想:模板
模板的分类:函数模板、类模板
函数模板(类模板):将功能相同,类型不同的函数(类)的类型抽象成虚拟的类型。当调用函数(类实例化对象)的时候,编译器自动将虚拟的类型 具体化。(实际上是建立了一个通用函数)
模版 完整的类型名 是 函数名/类名<类型>
二、函数模板
1.定义方式
关键字 template
模板会编译两次:
第一次:是对 函数/类模板 本身编译
第二次:函数调用处/类实例化处 将T的类型具体化
函数模板目标:模板是为了实现泛型,可以减轻编程的工作量,增强函数的重用性。
2.函数模板注意点
2.1 函数模板 和 普通函数 都识别(优先选择 普通函数)
2.2 函数模板 和 普通函数 都识别(强制使用函数模版)
<int>:告诉编译器是int类型,不用推导了
2.3 函数模版 自动类型推导时,不能对 函数参数 进行 自动类型转换。
调用 函数模板 时,如果 传入各参数类型 不相同,调用失败。
调用 普通函数 时,如果 实参类型 可以强制转换成 形参类型 ,仍然可以调用。
3.函数模板的重载
4.函数模版的局限性
当函数模板 推导出 T为数组或其他自定义类型数据,可能导致运算符不识别。
解决方法一:运算符重载(推荐)
解决方法二:具体化 函数模版
三、类模板
1.定义方式
模板 完整的类型名 是 Data<T1,T2>
或( template只能作用于class Data这个区域 )
类模板 实例化对象 不能自动类型推导,必须指明T类型。
【像Data(){},无参,无法知a、b是什么类型,无法开辟空间,所以 类模板不能自动类型推导】
2.类模板的成员函数在类外实现
(1)+template声明
(2)函数名前+作用域(作用域带 <类型> )
3.函数模板作为类模板的友元
4.普通函数作为类模板的友元
5.模板 头文件和源文件 分离问题
模板最好用 data.hpp 代替 data.h和data.cpp
【即把.cpp中的内容直接写在.h中,不需要再写.cpp了。
如果模板写在.cpp文件里,因为模板要编译两次,第一次编译在预处理阶段会编译.h头文件,第二次编译不会再编译.h头文件,这样的话就没有 具体化类型。
所以干脆不写.cpp文件,直接把.cpp文件的内容写在.h中,项目名称改成.hpp 】
6.类模板的继承
6.1 类模板派生出普通类
6.2 类模板派生出类模板