提问者:小点点

函数重载查询


使用同名函数时,参数列表必须不同(参数类型或所用参数数)。 我只是在练习这个概念。 我编写了下面的代码。

   #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个答案

匿名用户

字面也有类型。 由于整数文本3的类型为int,因此选择第一个重载。

由于浮点文字3.3的类型为double(但不是float;后缀为f,类似于3.3f,类型被确定为float),因此调用是不明确的,因为它可以隐式地转换为intfloat

匿名用户

在调用期间选择重载的过程称为重载解析。 给定参数的类型,编译器从候选函数列表中选择最佳可行函数,即可以用最少的提升和隐式转换调用的函数。

在第一种情况下,第一个myfunction(int)要求对int参数(3)进行0次转换,第二个参数要求进行1次转换(int->float),因此第一个参数被选为最佳候选参数。

在第二种情况下,double参数(3.3)需要转换为intfloat,因此没有明确的获胜者,因此调用是不明确的。

修复方法可以是使用float参数(3.3f)或将myFunction(float)更改为myFunction(double)

匿名用户

请尝试以下操作:

int x=myFunction(int(3));

float x=myFunction(float(3.3));