重载函数确定的三个步骤

函数重载指的是同一作用域下的函数名相同,参数列表不同的函数之间的关系(与返回值无关)。
考虑以下面的这组函数和函数调用:
void f();
void f(int);
void f(int,int);
void f(double,double=3.14);
f(5.6);   //call void f(double,double)

根据以下三个步骤确定函数:
1.确定候选函数
候选函数是与被调用函数同名的函数,并且在调用点上,它的声明可见。在例子中,有四个名为f的候选函数。
2.选择可行函数
可行函数必须满足两个条件:第一,函数的形参个数与该调用的实参个数相同;第二,每一个实参的类型必须与对应的形参的类型匹配,或者可被隐式转换为对应的形参类型。如果没有找到可行函数,则该调用错误。在例子中,f(int)和f(double,double)都是可行的。
3.寻找最佳匹配(如果有的话)
为了确定最佳匹配,编译器将实参类型到相应形参类型的转换划分等级,降序排列如下:
(1)精确匹配。实参与形参的类型完全一致。
(2)通过类型提升实现的匹配。
(3)通过标准转换实现的匹配。
(4)通过类类型转换实现的匹配。
例如:
void ff(int);
void ff(short);
ff('a');
字条字面值是char 类型,可提升为int型,也可转换为short型,但是类型转换的匹配劣于类型提升的匹配,结果应该该调用解释为对ff(int)的调用。
而对如下:
void manip(long);
void manip(float);
maip(3.14);
由于两者都是可行的标准转换,因此调用具有二义性。
4.含有多个形参的重载确定
如果函数调用使用了两个或者两个以上的显示实参,则函数匹配会更加复杂。如果有且仅有一个函数满足下列条件,则匹配成功:
(1)其每个实参的匹配都不劣于其他可行函数需要的匹配。
(2)至少有一个实参的匹配优于其他可行函数提供的匹配。
如:f(42,2.56);该调用上面例子中的哪个函数呢?
根据上面的规则可知会发生调用二义性,即编译器也无法决断了。  
<script></script>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值