先看一段代码:
int sum(int a,int b,int c){
return a + b + c;
}
float sum(float a,float b,float c){
return a + b + c;
}
char sum(char a,char b,char c){
return a + b +c;
}
int main(int argc,char *argv[]){
int d,e,f;
float g,h,i;
char x,y,z;
d = e = f = 1;
g = h = i = 1.1;
x = y = z ='a';
cout<<sum(d,e,f)<<endl;
cout<<sum(g,h,i)<<endl;
cout<<sum(x,y,z);
return 0;
}
在这段代码中,用到了三个同名的函数sum(),定义多个同名的函数的机制在C++中叫作函数的重载。(补充:一个函数的签名是由这个函数的形参类型和以及形参个数决定的。C++可以定义两个或更多的同名函数,但是任何两个同名函数不能有同样的签名)。
这三个函数的参数类型和返回值类型都不同,但实现的功能都相同,如何实现代码的复用,从而减少代码量呢?接下来我们引入一个和sum()具有相同功能的模板函数程序:
template<class T>
T sumT(T a,T b,T c){
return a + b + c;
}
int main(int argc,char *argv[]){
int d,e,f;
float g,h,i;
char x,y,z;
d = e = f = 1;
g = h = i = 1.1;
x = y = z ='a';
cout<<sumT(d,e,f)<<endl;
cout<<sumT(g,h,i)<<endl;
cout<<sumT(x,y,z);
return 0;
}
程序的运行结果如下图(两个结果一致)
在这里有人可能会对’a’ + ‘a’ + ‘a’ = ‘#‘产生疑问,首先字符’a’在ASCII中的十进制数值为97,那么sum(‘a’,‘a’,‘a’)的ASCII值便为291,由于ASCII共有128个字符(0~127)那么就需要进行取余操作:291%128=35,在ASCII表中对用’#’。
对于模板函数还要注意的一点是,template<class T>后面要紧跟函数,不是一次定义模板,这个程序就都可以用。