《函数重载与函数模板》由会员分享,可在线阅读,更多相关《函数重载与函数模板(11页珍藏版)》请在金锄头文库上搜索。
1、在编程时,有时我们要实现的是同一类的功能, 只是有些细节不同。例如希望从3个数中找出其中 的最大者,而每次求最大数时数据的类型不同,可 能是3个整数、3个双精度数或3个长整数。程序设 计者往往会分别设计出3个不同名的函数,其函数 原型为: int max1(int a,int b, int c); /求3个整数中的最大者 double max2(double a,double b,double c); /求3个双精度数中最大 者 long max3(long a,long b,long c); /求3个长整数中的最大者 C+允许用同一函数名定义多个函数,这些函数 的参数个数和参数类型不同。这就
2、是函数的重载 (function overloading)。即对一个函数名重新赋予 它新的含义,使一个函数名可以多用。*4.6 函数的重载对上面求最大数的问题可以编写如下的C+程序 。 例4.5 求3个数中最大的数(分别考虑整数、双精 度数、长整数的情况)。 #include using namespace std; int main( ) int max(int a,int b,int c); /函数声明double max(double a,double b,double c); /函数声明long max(long a,long b,long c); /函数声明int i1,i2,i3,
3、i; cini1i2i3; /输入3个整数i=max(i1,i2,i3); /求3个整数中的最大者coutd1d2d3; /输入3个双精度数d=max(d1,d2,d3); /求3个双精度数中的最大者coutg1g2g3; /输入3个长整数g=max(g1,g2,g3); /求3个长整数中的最大者 couta) a=b;if(ca) a=c;return a; double max(double a,double b,double c) /定义求3个双精度数中的最 大者的函数 if(ba) a=b;if(ca) a=c;return a; long max(long a,long b,long
4、 c) /定义求3个长整数中的最大者的 函数 if(ba) a=b;if(ca) a=c;return a; 运行情况如下: 185 -76 567 (输入3个整数) 56.87 90.23 -3214.78 (输入3个实数) 67854 -912456 673456 (输入3个长整数) i_max=567 (输出3个整数的最大值) d_max=90.23 (输出3个双精度数的最大值) g_max=673456 (输出3个长整数的最大值) 上例3个max函数的函数体是相同的,其实重载函 数并不要求函数体相同。重载函数除了允许参数类 型不同以外,还允许参数的个数不同。例4.6 编写一个程序,用来
5、求两个整数或3个整数 中的最大数。如果输入两个整数,程序就输出这两 个整数中的最大数,如果输入3个整数,程序就输 出这3个整数中的最大数。 #include using namespace std; int main( ) int max(int a,int b,int c); /函数声明int max(int a,int b); /函数声明int a=8,b=-12,c=27;couta) a=b;if(ca) a=c;return a; int max(int a,int b) /此max函数的作用是求两个整数中的最 大者 if(ab) return a;else return b; 运行
6、情况如下: max(a,b,c)=27 max(a,b)=8 两次调用max函数的参数个数不同,系统就根据 参数的个数找到与之匹配的函数并调用它。 参数的个数和类型可以都不同。但不能只有函数 的类型不同而参数的个数和类型相同。例如:int f(int); /函数返回值为整型 long f(int); /函数返回值为长整型 void f(int); /函数无返回值 在函数调用时都是同一形式,如“f(10)”。编译系 统无法判别应该调用哪一个函数。重载函数的参数 个数、参数类型或参数顺序3者中必须至少有一种 不同,函数返回值类型可以相同也可以不同。 在使用重载函数时,同名函数的功能应当相同或 相近
7、,不要用同一函数名去实现完全不相干的功能 ,虽然程序也能运行,但可读性不好,使人莫名其 妙。C+提供了函数模板(function template)。所谓函 数模板,实际上是建立一个通用函数,其函数类型 和形参类型不具体指定,用一个虚拟的类型来代表 。这个通用函数就称为函数模板。凡是函数体相同 的函数都可以用这个模板来代替,不必定义多个函 数,只需在模板中定义一次即可。在调用函数时系 统会根据实参的类型来取代模板中的虚拟类型,从 而实现了不同函数的功能。看下面的例子就清楚了 。 例4.7 将例4.6程序改为通过函数模板来实现。*4.7 函数模板#include using namespace
8、std; template /模板声明,其中T为类型参数 T max(T a,T b,T c) /定义一个通用函数,用T作虚拟的类型名 if(ba) a=b;if(ca) a=c;return a; int main( ) int i1=185,i2=-76,i3=567,i;double d1=56.87,d2=90.23,d3=-3214.78,d;long g1=67854,g2=-912456,g3=673456,g;i=max(i1,i2,i3); /调用模板函数,此时T被int取代d=max(d1,d2,d3); /调用模板函数,此时T被double取代g=max(g1,g2,g3
9、); /调用模板函数,此时T被long取代cout 或 template 通用函数定义 通用函数定义 在建立函数模板时,只要将例4.5程序中定义的第 一个函数首部的int改为T即可。即用虚拟的类型名 T代替具体的数据类型。在对程序进行编译时,遇 到第13行调用函数max(i1,i2,i3),编译系统会将函 数名max与模板max相匹配,将实参的类型取代了 函数模板中的虚拟类型T。此时相当于已定义了一 个函数:int max(int a,int b,int c) if(ba) a=b;if(ca) a=c;return a; 然后调用它。后面两行(14,15行)的情况类似。类型参数可以不只一个,可以根据需要确定个数 。如 template 可以看到,用函数模板比函数重载更方便,程序 更简洁。但应注意它只适用于函数的参数个数相同 而类型不同,且函数体相同的情况,如果参数的个 数不同,则不能用函数模板。