C++语言基础|函数重载

1. 函数重载

1.1 函数重载的定义

函数重载就是两个以上的函数,取相同的函数名,但是形参的个数和类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动决定调用哪一个函数。1

1.1函数重载的示例

例如:

int max(int,int);
int max(int,int,int);
float max(float,float);
double max(double,double); 

函数重载示例:

/******************************
* 函数的重载               *
*******************************/
#include<iostream>
using namespace std;
int add(int x,int y) //函数重载
{ 
   cout<<"(int, int)\t";
   return x+y; 
}
double add(double x,double y)//函数重载
{ 
       cout<<"(double, double)\t";
       return x+y; 
}
int add(int x,double y)//函数重载
{
       cout<<"(int, double)\t";
       return int(x+y); 
}
double add(double x,int y) //函数重载
{
     cout<<"(double,int)\t";
     return x+y; 
}
int main()
{ 
     cout<<add(9,8)<<endl;
     cout<<add(9.0,8.0)<<endl;
     cout<<add(9,8.0)<<endl;
     cout<<add(9.0,8)<<endl;
     return 0;
} 

2. 函数重载注意事项

  1. 各个重载函数的返回类型可以相同,也可以不同。但如果函数名相同、形参表也相同,仅仅是返回类型不同,则是非法的。在编译时会认为是语法错误。
// C++无法区分这两个函数。因为在没有确定函数调用是对哪一个重载的函数之前,//返回类型是不知道的。 
 int add(int i1,int i2);
 float add(int f1,int f2);

  1. 确定对重载函数的哪个函数进行调用的过程称为绑定(binding), 绑定的优先次序为精确匹配、对实参的类型向高类型转换后的匹配、实参类型向低类型及相容类型转换后的匹配。
//将char型转换成int型,然后与add(int,int)绑定。 
  add('A','A'+'0');
//函数实参向(double,double)转换,然后与add(double,double)绑定。 
  add(float(8),float(9));
//实参类型为(long double, int),向低类型转化。 
  add(long double(8),9);

3 重载函数的二义性

3.1 绑定(匹配)二义性

两个重载函数,编译器不知道进行哪种类型的转换,与哪个函数绑定,这种现象就叫绑定(匹配)二义性

3.2 消除二义性

消除这种二义性的办法有:

  1. 添加重载函数定义,使调用获得精确匹配。如:增加定义add(long double,int)
  2. 将函数的实参进行强制类型的转换,使调用获得精确匹配。
    例如:调用形式可改为add(double(long double(8)),9),但改为add(long double(8),long double(9))同样出现绑定二义性。

3.3 注意事项

重载函数与带默认形参值的函数一起使用时,有可能引起二义性。
例如:

void add(int x, int y, int z=0);

当调用add(8,9)时,不知是和add(int,int)绑定,还是和add(int,int,int=0)绑定?消除这种二义性的办法是增加或减少实参个数。


  1. 本教程仅供教学使用,参考教材 :《C++语言程序设计教程》,杨进才、沈显君编著,清华大学出版社,2022年1月第4版 ↩︎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皖山文武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值