一、模板是具有相同特性的函数或类的再抽象,模板是一种参数化的多态性工具。采用模板编程,可以为各种逻辑功能相同但数据类型不同的程序提供一种代码共享的机制。
二、模板的分类:函数模板和类模板
模板的实例化:模板通过参数实例化可以构建具体的函数或类,称为模板函数和模板类。
(一)、函数模板
1、函数模板的定义:
template<模板形参数>
返回值类型 函数名(参数表){
函数体
}
例:(1)具有求绝对值功能的函数模板定义:
#include<0iostream>
template<typename T>//模板定义,template是模板定义的关键字,T为参数模板(T是标识符,代表一个数据类型)
T abs(T a)//定义函数模板
{
return a<0?-a:a;
}
void main(){
int x=-12;
double y=12.5;
cout<<abs(x)<<endl;
cout<<abs(y)<<endl;
}
(2)具有求最大值功能的函数模板的定义:
#inclide<iostream>
template<class T>
T Max(T x,T y){
return (x>y)?x:y;
}
int main(){
int x1,y1;
float x2,y2;
double x3,y3;
cin>>x1>>y1;
cout<<Max(x1,y1)<<endl;//T为int
cin>>x2>>y2;
cout<<Max(x2,y2)<<endl;//T为int
cin>>x3>>y3;
cout<<Max(x3,y3)<<endl;//T为int
return 0;
}
注:
template是模板定义的关键字。<模板形参表>中包含一个或多个用逗号分开的模板形式参数,每一项均有关键字class或template引导一个由用户命名的标识符,此标识符为模板参数(用来进行类型传递)。
模板参数表示一种数据类型,可以是基本数据类型或类类型。该数据类型在发生实际函数调用时将被实例化,即用调用处的实际数据类型代替它。
(二)、类模板
如同函数模板一样,类模板是参数化的类,即用于实现数据类型参数化的类。应用类模板可以使类中的数据成员、成员函数的参数及成员函数的返回值能根据模板参数匹配情况取任意数据类型。这种类型既可以是C++预定义的数据类型,也可以是用户自定义的数据类型。
1、类模板的定义:
template<模板形参表>
class 类模板名
{
成员的声明;
}
#include<iostream>
using namespace std;
template<typename T>
class Square
{
T x;
public:
Square(T xx):x(xx){}
T (){return x*x;}
};
●类模板中的成员函数的定义,若放在类模板的定义之中,则与类的成员函数定义方法相同;若在类模板之外定义,则成员函数的定义格式如下:
template<模板形参表>
返回类类型 类模板名<形参名表>:: 成员函数名(参数表)
{
成员函数体
}
#include<iostream>
using namespace std;
template<typename T>
class Square{
T x;
public:
Square(T xx):x(xx){}
T fun(){return x*x;}
};
int main(){
Square<int> inta(15);//类的实例化
Square<float> floata(16.5);
Square<double> doublea(15.55);
cout<<"square of int data:"<<inta.fun()<<endl;
cout<<"square of float data:"<<floata.fun()<<endl;
cout<<"square of double data:"<<doublea.fun()<<endl;
}
2、
对于成员函数在类外定义的时候:
double Rectangle::circumference()
{//普通类的成员函数在类外的定义
return 2*length*width;
}
template<class T>
T Rectangle<T>::circumference()
{//类模板的成员函数在类外的定义
return 2*length*width;
}
3、类模板实例化的格式如下:
类模板名<实际类型> 对象名(实参表);