函数可以重载的条件
函数重载的对参数的要求是:参数个数不同,参数类型不同,它们是和还是或的关系?
函数重载的对参数的要求是:参数个数不同,参数类型不同,它们是和还是或的关系?
2015-06-20
确实有可能造成歧义。
这两个基本规则是“或”的关系。但编译器会需要更多的信息来确定到底调用哪个函数,步骤为:
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)都有参数需要进行类型转换,编译器不知道调用哪个“更好”。
举报