模板是对具有相同特性的函数或类的再抽象,模板是一种参数多态化的工具;参数多态化是指将程序所处理的对象类型参数化,使一段代码可以用于处理多种不同类型的对象。
模板分类:函数模板 类模板;
函数模板:
函数模板定义:
template <模板形参表>
返回值类型 函数名(参数表){
函数体
}
template是模板定义的关键字。
<模板形参表>中包含一个或多个用逗号分开的模板形式参数,每一项均由关键字class或typename引导一个由用户命名的标识 符,此标识符为模板参数(用来进行类型传递);模板参数表示一种数据类型,可以是基本数据类型或类类型。该数据类型在发生实际函数调用时将被实例化,即用调用处的实际数据类型替代它。
函数模板实例化(以有求最大值功能的函数模板为例)
#include <iostream.h>
template <class T>
T Max(T x,T y){
return (x>y)?x:y;
}
int Max(int x,int y)
{
if(x>y) return x;
else return y;
}
double Max(double x,double y)
{
if(x>y) return x;
else return y;
}
类模板:
定义:
template <模板形参表>
class 类模板名
{
成员的声明;
}
类模板中的成员函数的定义,若放在类模板的定义之中,则与类的成员函数的定义方法相同;若在类模板之外定义,则成员函数的定义格式如下:
template<模板形参表>
返回值类型 类模板名<形参名表>::成员函数名(参数表)
{
成员函数体
}
定义模板类的对象的格式如下:
类模板名 <实际类型> 对象名(实参表);
类模板实例化:
template <typename T>
class Rectangle{
private:
T length,width;
public:
Rectangle(T l, T w );
~Rectangle( );
T getLength( );
T getWidth( );
T circumference( );
T area( );
};
类外成员函数定义与函数模板一样:
template<class T>
T Rectangle<T>::circumference( )
{ //类模板的成员函数在类外的定义
return 2*length*width;
}