关于函数重载的查询
Query about function overloading
当使用同名函数时,参数列表必须不同(使用的参数类型或参数数量)。我只是在练习这个概念。我写了下面的代码。
#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 不是整数,所以很清楚调用哪个,但这次我得到编译器错误,说它不明确。
所以我怀疑为什么第一个代码有效但第二个代码无效。
文字也有类型。由于 integer literal 3
的类型为 int
,因此选择第一个重载。
因为 floating point literal 3.3
是 double
类型(但不是 float
;后缀 f
就像 3.3f
类型是确定为 float
),调用不明确,因为它可以隐式转换为 int
和 float
。
试试这个:
int x=myFunction(int(3));
float x=myFunction(float(3.3));
在调用期间选择重载的过程从候选列表中调用 overload resolution. Given the types of the arguments, the compiler selects the best viable function - 可以用最少的提升和隐式转换调用的过程。
在第一种情况下,第一个 myFunction(int)
需要对 int
参数进行 0 次转换 (3
),第二个需要一次转换 (int
- > float
), 所以第一个被选为最佳人选。
在第二种情况下,double
参数 (3.3
) 需要转换为 int
或 float
,因此没有明确的赢家,因此调用模棱两可。
解决方法是使用 float
参数 (3.3f
) 或将 myFunction(float)
更改为 myFunction(double)
。
当使用同名函数时,参数列表必须不同(使用的参数类型或参数数量)。我只是在练习这个概念。我写了下面的代码。
#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 不是整数,所以很清楚调用哪个,但这次我得到编译器错误,说它不明确。
所以我怀疑为什么第一个代码有效但第二个代码无效。
文字也有类型。由于 integer literal 3
的类型为 int
,因此选择第一个重载。
因为 floating point literal 3.3
是 double
类型(但不是 float
;后缀 f
就像 3.3f
类型是确定为 float
),调用不明确,因为它可以隐式转换为 int
和 float
。
试试这个:
int x=myFunction(int(3));
float x=myFunction(float(3.3));
在调用期间选择重载的过程从候选列表中调用 overload resolution. Given the types of the arguments, the compiler selects the best viable function - 可以用最少的提升和隐式转换调用的过程。
在第一种情况下,第一个 myFunction(int)
需要对 int
参数进行 0 次转换 (3
),第二个需要一次转换 (int
- > float
), 所以第一个被选为最佳人选。
在第二种情况下,double
参数 (3.3
) 需要转换为 int
或 float
,因此没有明确的赢家,因此调用模棱两可。
解决方法是使用 float
参数 (3.3f
) 或将 myFunction(float)
更改为 myFunction(double)
。