C++函数重载

在编程时,有时我们要实现的是同一类的功能,只是有些细节不同。例如希望从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++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同。这就是函数的重载(function overloading)。即对一个函数名重新赋予它新的含义,使一个函数名可以多用。

对上面求最大数的问题可以编写如下的C++程序。

【例4.5】求3个数中最大的数(分别考虑整数、双精度数、长整数的情况)。

复制纯文本新窗口
  1. #include <iostream>
  2. using namespace std;
  3. int main( )
  4. {
  5. int max(int a,int b,int c); //函数声明
  6. double max(double a,double b,double c); //函数声明
  7. long max(long a,long b,long c);//函数声明
  8. int i1,i2,i3,i;
  9. cin>>i1>>i2>>i3; //输入3个整数
  10. i=max(i1,i2,i3); //求3个整数中的最大者
  11. cout<<“i_max=”<<i<<endl;
  12. double d1,d2,d3,d;
  13. cin>>d1>>d2>>d3; //输入3个双精度数
  14. d=max(d1,d2,d3); //求3个双精度数中的最大者
  15. cout<<“d_max=”<<d<<endl;
  16. long g1,g2,g3,g;
  17. cin>>g1>>g2>>g3; //输入3个长整数
  18. g=max(g1,g2,g3); //求3个长整数中的最大者
  19. cout<<“g_max=”<<g<<endl;
  20. }
  21. int max(int a,int b,int c) //定义求3个整数中的最大者的函数
  22. {
  23. if(b>a) a=b;
  24. if(c>a) a=c;
  25. return a;
  26. }
  27. double max(double a,double b,double c)//定义求3个双精度数中的最大者的函数
  28. {
  29. if(b>a) a=b;
  30. if(c>a) a=c;
  31. return a;
  32. }
  33. long max(long a,long b,long c) //定义求3个长整数中的最大者的函数
  34. {
  35. if(b>a) a=b;
  36. if(c>a) a=c;
  37. return a;
  38. }
#include <iostream>
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,i;
   cin>>i1>>i2>>i3; //输入3个整数
   i=max(i1,i2,i3); //求3个整数中的最大者
   cout<<"i_max="<<i<<endl;
   double d1,d2,d3,d;
   cin>>d1>>d2>>d3; //输入3个双精度数
   d=max(d1,d2,d3); //求3个双精度数中的最大者
   cout<<"d_max="<<d<<endl;
   long g1,g2,g3,g;
   cin>>g1>>g2>>g3; //输入3个长整数
   g=max(g1,g2,g3); //求3个长整数中的最大者
   cout<<"g_max="<<g<<endl;
}

int max(int a,int b,int c) //定义求3个整数中的最大者的函数
{
   if(b>a) a=b;
   if(c>a) a=c;
   return a;
}

double max(double a,double b,double c)//定义求3个双精度数中的最大者的函数
{
   if(b>a) a=b;
   if(c>a) a=c;
   return a;
}

long max(long a,long b,long c)  //定义求3个长整数中的最大者的函数
{
   if(b>a) a=b;
   if(c>a) a=c;
   return a;
}

运行情况如下:
185-76567↙ (输入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】编写一个程序,用来求两个整数或3个整数中的最大数。如果输入两个整数,程序就输出这两个整数中的最大数,如果输入3个整数,程序就输出这3个整数中的最大数。

复制纯文本新窗口
  1. #include <iostream>
  2. using namespace std;
  3. int main( )
  4. {
  5. int max(int a,int b,int c); //函数声明
  6. int max(int a,int b); //函数声明
  7. int a=8,b=-12,c=27;
  8. cout<<“max(a,b,c)=”<<max(a,b,c)<<endl;//输出3个整数中的最大者
  9. cout<<“max(a,b)=”<<max(a,b)<<endl; //输出两个整数中的最大者
  10. }
  11. int max(int a,int b,int c)//此max函数的作用是求3个整数中的最大者
  12. {
  13. if(b>a) a=b;
  14. if(c>a) a=c;
  15. return a;
  16. }
  17. int max(int a,int b)//此max函数的作用是求两个整数中的最大者
  18. {
  19. if(a>b) return a;
  20. else return b;
  21. }
#include <iostream>
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;
   cout<<"max(a,b,c)="<<max(a,b,c)<<endl;//输出3个整数中的最大者
   cout<<"max(a,b)="<<max(a,b)<<endl; //输出两个整数中的最大者
}

int max(int a,int b,int c)//此max函数的作用是求3个整数中的最大者
{
   if(b>a) a=b;
   if(c>a) a=c;
   return a;
}

int max(int a,int b)//此max函数的作用是求两个整数中的最大者
{
   if(a>b) return a;
   else return b;
}

运行情况如下:
max(a, b, c)=27
max(a, b)=8

两次调用max函数的参数个数不同,系统就根据参数的个数找到与之匹配的函数并调用它。

参数的个数和类型可以都不同。但不能只有函数的类型不同而参数的个数和类型相同。例如:
int f(int);  //函数返回值为整型
long f(int);  //函数返回值为长整型
void f(int);  //函数无返回值
在函数调用时都是同一形式,如“f(10)”。编译系统无法判别应该调用哪一个函数。重载函数的参数个数、参数类型或参数顺序3者中必须至少有一种不同,函数返回值类型可以相同也可以不同。

在使用重载函数时,同名函数的功能应当相同或相近,不要用同一函数名去实现完全不相干的功能,虽然程序也能运行,但可读性不好,使人莫名其妙。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值