c++-C++中函数重载的问题,为什么没有调用double Max,而是调用了int Max?

问题描述

C++中函数重载的问题,为什么没有调用double Max,而是调用了int Max?

函数Max有以下两种重载形式:
int Max(int x, int y)
{
return x >= y ? x : y;
}
double Max(double x, double y)
{
return x >= y ? x : y;
}
在main函数中调用Max代码如下
double m = 11.5, n = 15.5;
cout << “ Max=” << Max(m,n) << endl;

输出 Max = 15,并警告 C4244: “参数”: 从“double”转换到“int”,可能丢失数据

为什么调用的是int Max(int x, int y) ?而不是double Max(double x, double y)?
有什么办法可以调用double Max(double x, double y)?

解决方案

不会吧,
除非调用处 看不到 重载为double Max(double x, double y)的函数,
不会出现这个问题的
这么简单的重载,C++很容易解析的

解决方案二:

隐式转化了,进入的是第一个

解决方案三:

如果返回类型考虑到函数重载中,这样将不可能再独立于上下文决定调用哪个函数。漏了函数重载的重要限定——作用域。

解决方案四:

2楼正解,除非你调用的地方这个Max(double x,double Y)方法没有加载呢

解决方案五:

main函数前要加函数声明:

 int Max(int x, int y);
 double Max(double x, double y);
时间: 2024-08-04 03:41:32

c++-C++中函数重载的问题,为什么没有调用double Max,而是调用了int Max?的相关文章

C++的函数重载

--每个现象后面都隐藏一个本质,关键在于我们是否去挖掘 写在前面: 函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题 1.声明/定义重载函数时,是如何解决命名冲突的?(抛开函数重载不谈,using就是一种解决命名冲突的方法,解决命名冲突还有很多其它的方法,这里就不论述了) 2.当我们调用一个重载的函数时,又是如何去解析的?(即怎么知道调用的是哪个函数呢) 这两个问题是任何支持函数重载的

C++语言基础 例程 函数重载

贺老师的教学链接 重载函数:同名同体,但接口不同 #include <iostream> using namespace std; int max(int a,int b,int c); //函数声明 double max(double a,double b,double c); long max(long a,long b,long c); int main( ) { int i1,i2,i3,i; cin>>i1>>i2>>i3; //输入3个整数 i=

C#中的函数重载

函数 我们以前在C++中曾经知道C++中有函数重载的概念,现在在ASp.Net的C#中我们仍然可以使用函数重载的概念和定义:假设我们在程序中定义了两个函数:String test(String str1) 而后 int test1(int i),他们的内容都是很简单的功能String test(String str1){Response.Write("函数重载测试,这个是String函数");Return "123232";}int test(int i){Resp

javascript中没有函数重载的概念实例讲解

  这篇文章主要介绍了通过实例理解javascript中没有函数重载的概念,十分的简单易懂,需要的朋友可以参考下 将函数名想象为指针,也有助于理解为什么ECMAScript中没有函数重载的概念.如下例子: 代码如下: function addSomeNum(num) { return num+100; } function addSomeNum(num) { return num+200; } var result=addSomeNum(100);//300 显然,这个例子中声明了两个同名函数,

解析C++中不能重载为友元函数的四个运算符

以下是对C++中不能重载为友元函数的四个运算符进行了详细的分析介绍,需要的朋友可以过来参考下   C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数),这是为什么呢? 现在先说说赋值运算符"="的重载 C++规定赋值运算符"="只能重载为类的非静态成员函数,而不可以重载为类的友元函数. 不能重载为类的静态成员应该比较容易理解,因为静态成员函数是属于整个类的,不是属于某个对象的,它只能去操作类静态数据成员.而赋值运算符

string-java中如果重载函数前不加@Override会怎么样?

问题描述 java中如果重载函数前不加@Override会怎么样? 比如重载toString函数,若前面不加那个@Override后果是什么?就不重载了? @Override public String toString() { return description; } 解决方案 1.帮助自己检查是否正确的复写了父类中已有的方法 2.告诉读代码的人,这是一个复写的方法 关于第一点,我给你再说明一下: 假设你现在要覆盖一个方法,然后因为你粗心,写错了参数的类型,刚好你又没有写@override注

第8周-任务1-方案2-复数类中运算符重载(非成员函数实现)

接:第8周-任务1-方案1-复数类中运算符重载(成员函数实现) 本文用方案二求解:用类的友元函数,而不是成员函数,完成上面提及的运算符的重载: [讲解视频] [参考解答] #include <iostream> using namespace std; class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} friend Complex operator+(Comp

c++ 函数模板重载-关于c++中函数模板的重载问题

问题描述 关于c++中函数模板的重载问题 直接上代码(简单),enter code here template< class T > void test(T x){ cout<<x<<endl; } void test(int); int main(){ int x = 1; test(x); } 上述程序使用非模板函数对函数模板test进行重载:按照书中的说法-这个非模板函数可以只声明原型,然后借用模板中定义的函数体. 但是链接的时候找不到那个非模板函数的定义(使用的

深度探究C++中的函数重载的用法_C 语言

C++ 允许同一范围内具有相同名称的多个函数的规范.这些函数称为重载函数,"重载"中对其进行了详细介绍.利用重载函数,程序员可以根据参数的类型和数量为函数提供不同的语义. 例如,采用字符串(或 char *)参数的 print 函数执行的任务与采用"双精度"类型的参数的函数执行的任务截然不同.重载允许通用命名并使程序员无需创建名称,例如 print_sz 或 print_d.下表显示了 C++ 使用函数声明的哪些部分来区分同一范围内具有相同名称的函数组.重载注意事项