假设,需要设计一个从3个数中找最大值的函数,C语言中需要根据类型定义3个函数:
int max1(int a, int b, int c);
float max2(float a, float b, float c);
long max3(long a, long b, long c);
C语言规定在同一作用域中不能有同名的函数,因此3个函数名字不同,C++中用允许同一函数名定义多个函数,这些函数的参数个数和参数类型不同,实现不同功能。这就是函数重载,如:
int max(int a, int b, int c){}
float max(float a, float b, float c){}
long max(long a, long b, long c){}
函数重载可以实现一个函数名多用,将实现相同的或类似功能的函数用同一个函数名来定义。但是,有个问题,就是在程序中依然需要分别定义每一个函数,例如定义了3个max函数,只是参数类型不同。为了解决这个问题,C++提供了函数模版(function template)。实际上就是建立一个通用的函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。
template <typename T>;
T max(T a, T b, T c)
{if(b > a) a = b;
if(c > a) a = c;
return a;
}
在函数定义时用T来定义变量a,b,c,显然变量类型未确定。要等函数调用时根据实参的类型来确定T是什么类型。其实也可以不用T而用任何一个标识符,许多人习惯用T(Type)。可以看到,
函数模版比函数重载更简洁。但应该注意它只适用于函数的参数个数相同而类型不同,且函数体相同的情况下。