为了账号安全,请及时绑定邮箱和手机立即绑定

函数可以重载的条件

函数重载的对参数的要求是:参数个数不同,参数类型不同,它们是和还是或的关系?

正在回答

3 回答

或的关系。


但注意这里有坑:

函数在传参时,参数是可以进行自动转换的。假如调用函数时传的参数类型没有完全匹配任何一个可重载函数,而且都可以进行类型转换的话,编译器会报歧义错误的。

0 回复 有任何疑惑可以回复我~
#1

GameDesigner_DaC 提问者

那如果是或的关系,也就是说参数类型可以相同,如果仅仅参数个数不同,会不会被理解为省略了某些参数的函数呢?说具体点就是有默认值的函数也是可以省略参数的,这样会让它跟重载函数看起来形式完全一样,造成歧义。
2015-06-22 回复 有任何疑惑可以回复我~
#2

onemoo 回复 GameDesigner_DaC 提问者

确实有可能造成歧义。 这里写不开了,我在后面的回复中举了个栗子...
2015-06-23 回复 有任何疑惑可以回复我~

确实有可能造成歧义。

这两个基本规则是“或”的关系。但编译器会需要更多的信息来确定到底调用哪个函数,步骤为:

1. 先确定同名函数都有哪些,并且是在调用点“可见的”,这些函数就是“候选函数”。

2. 判断每一个候选函数的参数是否满足你的调用参数(不考虑返回值类型),这些选出的函数被称为“可行函数”。这里面就包括参数数量不同但拥有默认参数值的参数。 如果根本就选不出来,就直接报错。

3. 如果可行函数不止一个,那么就看有没有哪个函数的参数类型可以“完全”匹配调用参数类型,有的话就选它。 如果都需要进行参数转换,那么就有歧义,编译器会报错。


比如重载了函数fun:

void fun(int); // #1
void fun(int, int); // #2
void fun(double, double = 1.0); // #3

当你这样调用:func(1.0); 就会调用第三个fun。  首先第二个fun会被排除掉,第一个和第三个fun会成为“可行函数”,但是第三个fun的第一个参数类型能完全匹配1.0,而第一个fun得需要进行参数类型转换。

但如果你这样调用: fun(1); 会调用第一个fun,这时可行函数仍为#1和#3,但是第一个可以完全匹配参数类型。

可如果你这样调用: fun(1, 1.0); 就会造成歧义,因为两个可行函数(#2和#3)都有参数需要进行类型转换,编译器不知道调用哪个“更好”。


3 回复 有任何疑惑可以回复我~
#1

GameDesigner_DaC 提问者

基本上明白了,辛苦了,谢谢!
2015-06-23 回复 有任何疑惑可以回复我~

重载的条件就是函数名相同,参数列表不同。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之离港篇
  • 参与学习       122700    人
  • 解答问题       474    个

C++扫清通往面向对象的最后一道障碍,将所有知识点融会贯通

进入课程

函数可以重载的条件

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信