模板(初级)
模板的由来
无聊的小故事
-
在印刷术出现之前,文人们读书或者出版书籍都是靠手写或者是手抄,要印几本就要抄几本,费时又费力且容易出错,这时就有人想出来弄一个模板印刷,我只需要刻一个板子出来,沾上墨水之后往纸上一盖即可,好比单车变高铁,印刷的速度、质量都得到了巨大的提升
-
c++也是这样,我们之前用c语言实现交换函数都得靠自己手搓,且不同的类型要手搓不同名字、不同参数的交换函数,过于麻烦了。而c++的重载是的我们不用改名字,换参数类型就行了,但这样也有几个弊端:
-
重载的函数仅仅是类型不同,代码复用率较低,只要有新的类型出现,用户就得新搓一个,太麻烦了
-
代码的可维护性较低,如果一个函数体出现逻辑上的错误,那么所有的重载都可能出错,都得修改
-
我们可不可以像印刷一样,也弄一个模板,让编译器根据不同的类型自动利用该模板去生成我们想要的呢?
模板的分类
函数模板
概念
-
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据试产类型产生函数的特定类型版本
函数模板格式
-
template或者template,**但不能使用struct去替代class
-
-
template<class T>
void Swap(T& x, T& y)
{
T tmp = x;
x = y;
y = tmp;
}
函数模板的原理
-
函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具,所以实际上模板就是把我们要做的事情交给了编译器
函数模板的实例化
-
-
模板参数的匹配原则
-
一个非模板函数可以和一个同名的函数模板同时存在,且该函数模板还能实例化成非模板函数
-
对于非模板函数和模板函数重名的情况,如果其他条件相同,会优先调用非模板函数,如果模板能实例化出一个更合适的函数,则优先调用模板。
-
模板函数不允许自动类型转换(如int和double放一起,int会转换成double),但普通安徽省农户可以
使用函数模板的注意事项
类模板
类模板的定义格式
template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
类模板的实例化
-
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
使用类模板的注意事项
-
类模板中的函数放在类外进行定义时一定要加模板参数列表