04--模板初阶(了解)
模板引入:CPP库里自带了swap模板
。以后不用自己去写swap
函数了。-> 开启了泛型编程的时代.
1. 模板概念
模板: 与类型无关的通用代码,用于代码的复用。
分类:分为 函数模板 和 类模板。
模板 和 typedef 的区别???
typedef
的缺陷在于不能灵活处理多种类型的替换, 模板的参数类型是自动推导的, 而 typedef
具有不可控制的缺陷.
2. 函数模板概念
语法格式:
3. 函数模板的实例化
编译通过推到类型,用函数模板,生成对应的函数,这个过程叫做模板实例化。分为隐式实例化和显示实例化两种。
隐式实例化:让编译器根据实参自动推演模板参数实际类型.
显示实例化:在函数名后<>
种指定模板参数的实际类型
注意: typename 也可以用 class 关键字.
4. 模板参数的匹配原则
- 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。
- 对于非模板函数和同名函数模板,如果其他条件都相同,在调用时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数,那么将选择模板。
- 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换
5. 类模板概念
template<class T1, class T2, ..., class Tn>
class 类模板名
{// 类内函数定义
};
6. 类模板的实例化
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>
,然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
7. 模板的意义
模板带领语言发展走上了一条快车道,开启了泛型编程的新时代。
8. 模板的注意事项
- 模板的类名和类型可能会不一致。比如说class A类,类名是A,但是我们在定义的时候需要写为
A<int> a
,这时候类型是A<int>
. - 模板类,声明与定义要尽量放在同一个文件中。因为如果要分离的话,需要给函数定义部分也要加上模板的声明才能编过。并且强烈不建议这样做。
- 类模板声明与定义分离不能在两个文件中。也不是完全不能,原因见模板进阶。