模板是对具有相同特性的函数或类的再抽象,模板是一种参数化的多态性工具。
所谓参数化多态性,是指将程序所处理的对象的类型参数化,使一段程序代码可以用于处理多种不同类型的对象。
一、模板分类:
- 函数模板
- 类模板
二、模板的实例化(important)
模板通过参数实例化可以构建具体的函数或类,称为模板函数和模板类。
三、函数模板
格式:
template <模板形参表>
返回值类型 函数名(参数表)
{ 函数体 }
例:
- 具有求绝对值功能的函数模板的定义
#include<iostream.h>
template<typename T> //模板定义,T为模板参数
T abs(T a) { //定义函数模板
return a<0?-a:a;
}
- 具有求最大值功能的函数模板的定义
#include <iostream.h>
template <class T>
T Max(T x,T y){
return (x>y)?x:y;
}
注:template是模板定义的关键字
<模板形参表>中包含一个或多个用逗号分开的模板形式参数,每一项均由关键字class或typename引导一个由用户命名的标识符,此标识符为模板参数(用来进行类型传递)
四、类模板
应用类模板可以使类中的数据成员、成员函数的参数及成员函数的返回值能根据模板参数匹配情况取任意数据类型。这种类型既可以是C++预定义的数据类型,也可以是用户自定义的数据类型。
格式:
template <模板形参表>
class 类模板名
{
成员的声明;
}
例:
抽象数据类型长方形的定义
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<模板形参表>
返回值 类模板名<形参名表>::成员函数表(参数表)
{成员函数体}
例:
template<class T>
T Rectangle<T>::circumference( )
{ //类模板的成员函数在类外的定义
return 2*length*width;
}