C++ 函数模板与类模板

一、函数模板

1、函数模板:建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟类型来代表这个通用函数来代表。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中虚拟的类型,从而实现不同函数的功能。

作用:功能相同而数据类型不同的一些函数,不必一一定义各个函数,通过定义一个可以对任何类型变量操作的模板函数,在调用函数时,系统会根据实参的类型,取代函数模板中的类型参数,得到具体的函数。

2、函数模板的一般形式

template

template 

template 的含义是“模板”,尖括号中 typename(或class)是关键字,T是一个类型参数(虚拟的类型名)。 typename和class的作用相同,都是表示“类型名”,二者可以互换。

3、适用范围

函数模板比函数重载更方便,程序更简洁,但是它只适用于函数体相同、函数的参数个数相同而类型不同的情况。如果函数参数的个数不同,则不能用函数模板。

4、应用举例

#include
template  //模板声明,其中T为类型参数
T max(T a,T b,T c) //定义一个通用函数,用T作为虚拟函的类型名
{
   if(b>a) a=b;
   if(c>a) a=c;
   return a;
}


//使用方法
int main()
{
  int i1=1,i2=3,i3=5,i;
  double d1=2.1,d2=7.3,d3=9.6,d;
  long g1=6845,g2=-956;g3=8845,g;
  i=max(i1,i2,i3);//调用模板函数,此时T被int取代
  d=max(d1,d2,d3);//调用模板函数,此时T被double取代
  g=max(g1,g2,g3);//调用模板函数,此时T被long取代
}

二、类模板

1、类模板的一般形式

template <class 类型参数名>

template 是模板,template后面尖括号内的内容为模板的参数表,class表示其后面的是类型参数,类型参数名可以任意取。

类模板实例化:

类模板名<实际类型名> 对象名(参数表);

2、特点:由于模板包含类型参数,因此又称为参数化表,模板是类的抽象,类是模板的实例。利用模板可以建立包含各种数据类型的类。

3、应用举例

声明一个类模板,利用它实现两个整数的比较

template  //声明类模板,虚拟类型名为numtype
class Compare //类模板名为Compare
{
   private:
     numtype x,y;
   public:
     Compare(numtype a,numtype b) //定义构造函数
     {
        x=a;
        y=b;
     }
     numtype max()  //函数类型暂定为numtype
    {
      return (x>y)? x:y;
    }
    numtype min()
   {
      return (x cmpl(3,7);//定义对象cmpl,用于两个整数的比较
   cmp1.max();
   cmp1.min();
}

类模板中成员函数在类模板内定义,不能用一般类成员函数的形式。应按照以下形式

template  //表示是类模板
numtype Compare  ::max()  //numtype是虚拟类型名,Compare 表示带参数的类
{
   return(x>y)? x:y;
}

 

你可能感兴趣的:(C++)