函数重载中程序的工作

Working of program in Function Overloading

本文关键字:工作 程序 重载 函数      更新时间:2023-10-16

我想问为什么这个程序不生成编译时错误?

int Add(int x, int y){
    return (x+y);
}
double Add(double x, double y, double z){
    return (x+y);
}
int main()
{
    cout<<Add(5,6);
    cout<<Add(5.5,6.6);
    return 0;
}

Add(5,6);调用int Add(int x, int y)。这一点很清楚。

现在Add(5.5,6.6)寻找合适的匹配函数。它发现一个有两个论点,一个有三个论点。现在它检查是否可以使用带有两个参数的函数。实际上,它可以将double转换为int。因此它再次使用int Add(int x, int y)

如果您提供一个double Add(double x, double y),它会找到两个具有两个参数的函数,并检查哪一个"最匹配"。这将是double Add(double x, double y)

因为C++定义了从doubleint的隐式转换,该转换将在第二次调用中应用。

参见C++11[conv.fpint]§1:

浮点类型的prvalue可以转换为整型的prvalue。转换截断;也就是说,分数部分被丢弃。如果截断的值不能在目标类型中表示,则行为是未定义的。

当您调用时

Add(5.5,6.6);

它被映射到函数签名

int Add(int x, int y);

因此,5.5->5和6.8->6转换发生你得到的答案是11(5+6)。

解决方案归结为参数的数量:

对于双打,你有

double Add(double x, double y, double z){
    return (x+y);
}

该函数在使用之前只需要/正好需要3个变量,因此当您只指定2个参数时,只有一个选项可用:

int Add(int x, int y){
    return (x+y);
}

如果你想让它多用途,你必须把它改成

double Add(double x, double y, double z = 0.0){
    return (x+y+z);
}

这将允许您根据需要将2个或3个双精度添加在一起,因为添加的2个双精度与添加到0.0的2个双倍精度相同。

z(double z = 0.0)的参数只是一个默认值声明:大多数编译器的工作基础是,在参数列表上从右到左,可以省略有默认值的参数,因此我可以执行以下操作:

double Add(double x= 0.0, double y=0.0, double z = 0.0)

并且以下每个呼叫都是有效的:

Add();
Add(1.0);
Add(1.1,2.2);
Add(1.1,2.2,3.3);
Add(1);
Add(1,2);
Add(1,2,3);

我们没有指定的值将通过使用我们之前定义的默认值(0.0)来确定。

修改功能的使用示例

#include <iostream>
using namespace std;
double Add(double x, double y, double z = 0.0){
    return (x+y+z);
}
int main() {
    cout << Add(1.1,2.1,3.1) << endl;
    cout << Add(2,3) << endl;
    cout << Add(1.0, 2.12345) << endl;
    return 0;
}

希望这能有所帮助,但如果您需要更多信息或细节,请告诉我:)

Guys这将生成一个编译错误'Add':没有重载函数需要两个参数要使用Add函数需要三个参数,包括int和double。

虽然我很感激你对此的回答,但你必须明白,C++中的函数重载需要在调用中指定确切数量的参数。

Visual Studio不允许u编译上述源代码。将三个参数传递给主函数中函数的调用。

。。cout<lt;加(5,6,7)<lt;endl;cout<lt;添加(5.5,6.6,2)<lt;endl;。。.