关于函数重载的查询

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.3double 类型(但不是 float;后缀 f 就像 3.3f 类型是确定为 float),调用不明确,因为它可以隐式转换为 intfloat

试试这个:

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) 需要转换为 intfloat,因此没有明确的赢家,因此调用模棱两可。

解决方法是使用 float 参数 (3.3f) 或将 myFunction(float) 更改为 myFunction(double)