所谓的模板,就是将某段程序中的数据类型参数化,使得它能够处理某个范围内的数据类型,而不必为每种可能的类型都建立一个实例,从而避免了重复劳动,增强了程序的灵活性和有效性。
1 使用模板的必要性
C++ 中的模板提供了重用源代码的方法。例如,设计一个求两参数最大值的函数,不使用模板时,需要定义以下四个函数:
int max (int a,int b) { return( a>b ) ? a , b;
long max ( long a , long b ) { return ( a>b ) ? a , b; }
double max( double a , double b) { return ( a>b ) ? a ,b;}
char max( char a r char b ) { return( a>b ) ? a , b; }
如果使用模板,则只需要定义一个函数:
Template<class type> type max(type a ,type b)
{return( a>b ) ? a,b;}
模板对各种数据类型,执行完全相同的操作。根据函数调用中提供的参数,编译器自动实例化不同的对象代码函数。如程序218.cpp 所示。
//案例名称:使用模板的必要性
//程序名称: 218.cpp
#include<iostream>
#include <string.h>
using namespace std;
template<class T>
T max1(T a,T b)
{
return a>b ? a:b;
}
int main()
{
cout<< "max(20,30)="<< max1(20,25)<<endl;
cout<<"max('t','v')="<<max1('t','v')<<endl;
cout<<"max(10.1,15.2)="<<max1 (10.1,15.2)<< endl;
}
程序执行的结果如图 2-18 所示。
图2-18执行结果
程序执行过程中,编译器自动生成以下三个重载函数:
int max(int a, int b) {return a>b ? a :b; }
float max(float a, float b) {return a>b ? a : b;}
char max(char a, char b) { return a>b ? a : b; }
2模板的分类
C++ 程序由类和函数组成,模板也分为类模板 (class template) 和函数模板(function template)。
在说明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的形参,然后生成一个重载函数。该重载函数的定义体与函数模板的函数定义体相同,称为模板函数 (template function)。同样,在说明了一个模板之后,可以创建类模板的实例,即生成模板类。