一、泛型编程
1.什么是泛型编程
泛型编程:是一种程序设计方法,编写于类型无关的通用代码,实现代码复用。而模版就是泛型编程的基础和核心。
二、template<>模版
1.template模版介绍
模版,顾名思义就是一个模具,人们只需要写一份代码,实现在多个类型上重复使用。不仅减少代码量,同时也增加了可维护性。模板的声明或定义只能在全局,命名空间或类范围内使用。不能在局部范围或函数内进行。
我们有两种模版:
1.函数模版 2.类模版
2.template的定义
1.模版的分类:
类模版:
template<class 类型名,class 类型名,……>
class 类名{函数体};
函数模版:
template<class 类型名1,class 类型名2,……>
返回类型 函数名(类型名1 参数名,……)
{函数主体};
注意:typename也可以代替class,但是不能用struct代替class。
下面就是类模板和函数模板:
2.函数模版:
函数模版与类型无关,在使用时被参数化,根据传进来的类型,编译器自动匹配相应的模版。
这就是一个函数模版,函数根据传过来的数据(是同一个类型的数据),将其参数化为x和y,并执行相加输出。
2.2函数模版的原理
我们先看上面的函数模版:我们分别用int,double,char类型来调用。最后都能运行出结果。由此我们可以看出编译器在我们看不见的地方推演出三份函数,然后调用相应的函数来实现我们想要的结果。
2.3函数模版的实例化
我们之前这样调用函数,直接给出参数类型。然后由编译器自动识别类型,再传给形参的方式,我们叫做隐式实例化:
当我们在调用函数后面加上类型,就是告诉编译器我要传什么类型的数据,这种叫现式传参
如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。
上面隐式和显式的运行结果:
2.4函数模版的调用原则
如果我们写了一个函数模版,同时也写了一份实现函数,那编译器会调用谁呢?
通过调试我们发现,编译器会调用我们自己实现的那个函数。其实这就相当于对编译器来说有现成的,谁还去自己做。
3.类模板
3.1类模板的定义
其实和函数模版类似,只是类模板是对于类,函数模版只是对于一个函数。
3.1类模板的实例化
在类名后中的< >声明类型即可。