函数重载中程序的工作
Working of program in Function Overloading
我想问为什么这个程序不生成编译时错误?
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++定义了从double
到int
的隐式转换,该转换将在第二次调用中应用。
参见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;。。.
- 以螺旋方式打印矩阵的程序.(工作不好)
- 我的评分程序无法正常工作
- 如何解决在负数的情况下程序以相同方式工作的问题?
- 如何使实例化在我的 OpenGL 程序中工作?
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作
- 有没有办法在RCPP程序无法正常工作时阻止RGui崩溃?
- cout 在我的程序上无法正常工作,有人可以帮助我吗?
- C++程序工作,但 Windows 显示"程序.exe已停止工作"
- 程序在CLion IDE中工作,但exe不起作用
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 为什么使用 exec() 重新启动程序不能正常工作?
- 使用程序生成来创建磁盘,但纹理无法正常工作
- 我无法让我的程序工作,我一直得到未定义的符号:C
- 所有Visual Studio安装程序崩溃,可视化构建工具也无法正常工作
- 名为DLL的C++windows服务程序工作不正常
- .exe应用程序在windows10中创建新模块时抛出错误,但在windows7中工作正常
- O2优化水平中断程序工作
- 从书本中学习C++无法使该程序与类一起工作
- r-工作程序中对自定义函数的未定义引用(C++和RcppParallel)
- 带有 Allegro 5 的工作程序不再起作用