模板引入
模板主要是用来解决类库与类库使用不是一个人,编写类库时,不能确定使用类库的人会传入什么类型的数据,而做的一个类型抽象,编译器根据具体调用类库的时候,调用者传入的参数自动推导出数据类型,来替换类库中的数据类型。template关键字定义一个模板,typename关键字指定模板类型抽象名称。示例如下:
template<typename T> void myswp(T &a,T &b) //交换数据
{
T temp;
temp=a;
a=b;
b=temp;
}
int a = 3;
int b = 2;
myswp(a,b);//调用模板函数,模板根据a,b类型推导出模板类型;
模板函数,就是在编写函数时不指定形参具体类型,而是由编译器根据调用函数时传参类型来倒推函数(形参)的类型。类型和值都参数化,对类型和值都延迟确认;最终生成的可执行文件无模板痕迹,在编译时就已经把模板处理好了,模板是c++的一种语法糖,目的是减少编程中代码重写这种体力活的一种语法特性。
模板编程也是一种多态的表现,继承中的多态是“动态多态”,而模板是“静态多态”,继承中的多态是指运行目标在代码运行过程中根据输入条件来确定如何运行,而静态多态是编译器在编译过程中,根据编译时的状态来确定如何编译,运行过程是不可变,所以叫静态。
模板有什么用
模板在c++中的地位就类似于指针在c中的地位,会模板的人与不会模板的人完全是两重天,模板能让我们编写与类型无关的函数,动态确定类型,模板是一种抽象维度,使用模板能让我们写出抽象度更高的代码,模板非常适合用来写库函数,因为它的数据类型可以在执行的时候来确定。使得模板的通用型特别高,抽象是拿复杂度来节省工作量,用处很大,但是学起来也更难。
模板的2个细节
- 如上例,模板定义时使用的typename也可以使用class替换,效果完全没差别,使用谁看个人习惯,如下示例,注意定义模板时后面不能有封号。
template <tepename T>等效于template<class T> //后面无“ ; ”封号
- 模板定义中可以有多个tepename,使用时按名称匹配,用来给函数同时传入不同类型的数,示例如下:
template <typename T,typename A> //定义2个模板名称
T myswp(T &a ,A &b) //传参使用不同类型,返回值使用模板类型
模板名称可以任意取,只是行业习惯使用T。
类模板
模板分2种,函数模板和类模板,前面我们引入的就是函数模板,即在函数的形参或返回值使用模板的虚拟类型。而类模板实际上和函数模板也很类似,目的就是将类中的一些类型使用模板定义成虚拟类型,使用类的人在定义对象的时候再实际传入模板的类型。类模板示例如下:
template <typename T> class people //模板类前添加模板类型声明
{
public:
people(T a); //类型使用模