当使用同名函数时,参数列表必须不同(参数类型或使用的参数数量)。我只是在练习这个概念。我写了下面的代码。
#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 不是整数,所以很清楚调用哪个,但这次我得到编译器错误,说它不明确。
所以我怀疑为什么第一个代码有效但第二个代码无效。
最佳答案
调用过程中选择重载的过程称为overload resolution .给定参数类型,编译器选择 best viable function来自候选列表 - 可以用最少数量的促销和隐式转换调用的候选列表。
在第一种情况下,第一个 myFunction(int)
需要对 int
参数 (3
) 进行 0 次转换,而第二个需要一次转换(int
-> float
),因此选择第一个作为最佳候选者。
在第二种情况下,double
参数 (3.3
) 需要转换为 int
或 float
,所以没有明确的赢家,因此这个决定是模棱两可的。
修复可能是使用 float
参数 (3.3f
) 或将 myFunction(float)
更改为 myFunction(double )
。
关于c++ - 关于函数重载的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63086806/