使用同名函数时,参数列表必须不同(参数类型或所用参数数)。 我只是在练习这个概念。 我编写了下面的代码。
#include <iostream>
int myFunction(int n)
{
return 2*n;
}
float myFunction(float n)
{
return 3*n;
}
int main()
{
int x=myFunction(3);
std::cout << x;
return 0;
}
我想我会得到错误,因为编译器会混淆使用哪个myFunction,因为我直接传递值3,而没有将它存储在特定类型的变量中。 但我得到了输出6。 所以我尝试了下面的代码。
#include <iostream>
int myFunction(int n)
{
return 2*n;
}
float myFunction(float n)
{
return 3*n;
}
int main()
{
float x=myFunction(3.3);
std::cout << x;
return 0;
}
前一个运行良好,我认为这也会运行良好,因为3.3不是整数,所以很清楚该调用哪个,但这次我得到了编译器错误,说它是不明确的。
所以我的疑问是为什么第一个代码有效,而第二个代码无效。
字面也有类型。 由于整数文本3
的类型为int
,因此选择第一个重载。
由于浮点文字3.3
的类型为double
(但不是float
;后缀为f
,类似于3.3f
,类型被确定为float
),因此调用是不明确的,因为它可以隐式地转换为int
和float
。
在调用期间选择重载的过程称为重载解析。 给定参数的类型,编译器从候选函数列表中选择最佳可行函数,即可以用最少的提升和隐式转换调用的函数。
在第一种情况下,第一个myfunction(int)
要求对int
参数(3
)进行0次转换,第二个参数要求进行1次转换(int
->float
),因此第一个参数被选为最佳候选参数。
在第二种情况下,double
参数(3.3
)需要转换为int
或float
,因此没有明确的获胜者,因此调用是不明确的。
修复方法可以是使用float
参数(3.3f
)或将myFunction(float)
更改为myFunction(double)
。
请尝试以下操作:
int x=myFunction(int(3));
float x=myFunction(float(3.3));