函数重载混乱

时间:2022-06-22 19:05:24
老师给我们留的作业,要求我们写一个重载的小程序,有两个函数
int area(int &r)     //求圆面积
int area(int h = 5,int a = 6)    //求三角形面积
可是我在main里无论怎么调用,求圆面积的函数怎么是不能被调用,请问怎么才能准确的调用这两个函数呢?

10 个解决方案

#1


呵呵,你最好贴出代码来大家好帮你看看,你
目前所给的信息是不是少了点?

#2


#include <iostream>
using namespace std;

int area(int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}
int area(int h = 4,int r = 5)
{
int ret = h*r/2;
return ret;
}
int main()
{
cout<<"直径为6的圆的面积为:"<<area(6)<<endl;
cout<<"高为3底为2的三角形面积为:"<<area(3,2)<<endl;
cout<<"默认的三角形面积为:"<<area()<<endl;
}

三次调用全都调用的第二个函数,怎么才能调用第一个呢?

#3


因为你是用引用(int &r)做参数,而一个文字量(就是6呀,3呀,2呀那些)是不能作为引用的。另一方面,计算三角形面积那个函数的参数是按值传递的,可以接受文字量,所以所有的调用都被指向它。解决办法有两个:
1.修改圆面积计算函数的参数
    int area( int r )// 不要提供缺省值,否则调用area()时编译器就不知道你是要调用哪一个了
或者:
    int area( const int& r )// 文字量量可以作为常量引用
2.修改调用方式:
int r = 6;
cout << area( r );

不过有一点不明白,为什么你要用引用作为参数?难道要在函数内修改它?

#4


我来回答你的问题吧!希望对你有帮助!

首先计算圆面积的函数定义有问题,问题在参数不应该声明为int &r,而应该生民为const int &r。因为这和你在主函数main中的调用area(6)有关。6是常数,它只能传给常量引用(const int &r),而不能传给非常量引用(int &r)。你可以通过下面的程序来验证。
程序1:
#include <iostream>
using namespace std;

int area(int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}
int main()
{
    
cout<<"直径为6的圆的面积为:"<<area(6)<<endl;
system("pause");
return 0;
}

通不过编译!

程序2:
#include <iostream>
using namespace std;

int area(const int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}
int main()
{
    
cout<<"直径为6的圆的面积为:"<<area(6)<<endl;
system("pause");
return 0;
}
通过了编译!

程序3:
#include <iostream>
using namespace std;

int area(int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}
int main()
{

         int a=6;
cout<<"直径为6的圆的面积为:"<<area(a)<<endl;
system("pause");
return 0;
}
通过了编译!

#5


你可能有疑问:为什么你上面给出的程序通过了编译?

那是因为你有两个area()函数,所以在主函数main()中area(6)调用的是计算三角面积的area()函数。

其次:你如果你把程序改成下面任何一种,又会出现重载二意性,而不能通过编译:
程序1:
#include <iostream>
using namespace std;

int area(const int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}

int area(int h = 4,int r = 5)
{
int ret = h*r/2;
return ret;
}


int main()
{
    
cout<<"直径为6的圆的面积为:"<<area(6)<<endl;

cout<<"高为3底为2的三角形面积为:"<<area(3,2)<<endl;
cout<<"默认的三角形面积为:"<<area()<<endl;

system("pause");
return 0;
}

程序2:
#include <iostream>
using namespace std;

int area(int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}

int area(int h = 4,int r = 5)
{
int ret = h*r/2;
return ret;
}


int main()
{
         int a=6;
cout<<"直径为6的圆的面积为:"<<area(a)<<endl;

cout<<"高为3底为2的三角形面积为:"<<area(3,2)<<endl;
cout<<"默认的三角形面积为:"<<area()<<endl;

system("pause");
return 0;
}

因为在主函数main()中area(6)[或者area(a)]的调用中,函数int area(const int &r)和int area(int h = 4,int r = 5)都是精确比配的函数,所以出现了二意性。

#6


你把程序改成下面这种就可以达到你的目的,但是我觉得别扭的要死,但愿你没有这种感觉!嘿嘿!

#include <iostream>
using namespace std;

int area(const int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}

int area(double h = 4,double r = 5)
{
int ret = h*r/2;
return ret;
}


int main()
{
         cout<<"直径为6的圆的面积为:"<<area(6)<<endl;
cout<<"高为3底为2的三角形面积为:"<<area(3,2)<<endl;
cout<<"默认的三角形面积为:"<<area()<<endl;

system("pause");
return 0;
}

#7


楼上兄弟讲得很细,很好,有空交流一下.

还有,我是来得分,我只要星星.

#8


谢谢大家说了这么多,也提出了不少解决方法,但是有一点我说得不太清楚,就是我们老师作业的要求:
面向对象程序设计第4周上机题

关于函数重载、缺省参数和引用的实验

写一个关于求面积的重载函数area(),分别能够求圆面积和三角形的面积,最后在main函数中输入参数并调用该函数,得出任意给定的圆或三角形的面积。

要求:1、求圆面积函数的参数为圆的直径的引用,并令其数据类型为整形,。
·在函数中试修改参数的值,并将修改后的值在main()函数中显示。
  2、求三角形面积函数的参数是其底和高,在此函数中出现缺省参数。 
·在main函数中用多种方式调用带缺省参数的area()函数。

目的:1、体会函数重载的意义和条件
  2、体会缺省参数的使用方法
      3、体会引用作为参数与直接传参数值的区别

#9


首先,程序并没有要求传递常量参数,所以改成变量就解决了。

第二,回答你的问题,area(6)
 在程序中被认为int area(int h = 4,int r = 5)的调用

其中  h=6,r=5

#10


#include <iostream>
using namespace std;

int area( int &r)
{
int a = r/2;
int ret = 3.14*a*a;
r=r+1;
return ret;
}

double area(double h = 4,double r = 5)
{
double ret = h*r/2;
return ret;
}


int main()
{

int r=6;
    cout<<"直径为6的圆的面积为:"<<area(r)<<endl;
cout<<"直径修改为:"<<r<<endl;
cout<<"高为3底为2的三角形面积为:"<<area(3,2)<<endl;

cout<<"高为3底为默认的三角形面积为:"<<area(3)<<endl;
cout<<"默认的三角形面积为:"<<area()<<endl;

system("pause");
return 0;
}

#1


呵呵,你最好贴出代码来大家好帮你看看,你
目前所给的信息是不是少了点?

#2


#include <iostream>
using namespace std;

int area(int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}
int area(int h = 4,int r = 5)
{
int ret = h*r/2;
return ret;
}
int main()
{
cout<<"直径为6的圆的面积为:"<<area(6)<<endl;
cout<<"高为3底为2的三角形面积为:"<<area(3,2)<<endl;
cout<<"默认的三角形面积为:"<<area()<<endl;
}

三次调用全都调用的第二个函数,怎么才能调用第一个呢?

#3


因为你是用引用(int &r)做参数,而一个文字量(就是6呀,3呀,2呀那些)是不能作为引用的。另一方面,计算三角形面积那个函数的参数是按值传递的,可以接受文字量,所以所有的调用都被指向它。解决办法有两个:
1.修改圆面积计算函数的参数
    int area( int r )// 不要提供缺省值,否则调用area()时编译器就不知道你是要调用哪一个了
或者:
    int area( const int& r )// 文字量量可以作为常量引用
2.修改调用方式:
int r = 6;
cout << area( r );

不过有一点不明白,为什么你要用引用作为参数?难道要在函数内修改它?

#4


我来回答你的问题吧!希望对你有帮助!

首先计算圆面积的函数定义有问题,问题在参数不应该声明为int &r,而应该生民为const int &r。因为这和你在主函数main中的调用area(6)有关。6是常数,它只能传给常量引用(const int &r),而不能传给非常量引用(int &r)。你可以通过下面的程序来验证。
程序1:
#include <iostream>
using namespace std;

int area(int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}
int main()
{
    
cout<<"直径为6的圆的面积为:"<<area(6)<<endl;
system("pause");
return 0;
}

通不过编译!

程序2:
#include <iostream>
using namespace std;

int area(const int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}
int main()
{
    
cout<<"直径为6的圆的面积为:"<<area(6)<<endl;
system("pause");
return 0;
}
通过了编译!

程序3:
#include <iostream>
using namespace std;

int area(int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}
int main()
{

         int a=6;
cout<<"直径为6的圆的面积为:"<<area(a)<<endl;
system("pause");
return 0;
}
通过了编译!

#5


你可能有疑问:为什么你上面给出的程序通过了编译?

那是因为你有两个area()函数,所以在主函数main()中area(6)调用的是计算三角面积的area()函数。

其次:你如果你把程序改成下面任何一种,又会出现重载二意性,而不能通过编译:
程序1:
#include <iostream>
using namespace std;

int area(const int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}

int area(int h = 4,int r = 5)
{
int ret = h*r/2;
return ret;
}


int main()
{
    
cout<<"直径为6的圆的面积为:"<<area(6)<<endl;

cout<<"高为3底为2的三角形面积为:"<<area(3,2)<<endl;
cout<<"默认的三角形面积为:"<<area()<<endl;

system("pause");
return 0;
}

程序2:
#include <iostream>
using namespace std;

int area(int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}

int area(int h = 4,int r = 5)
{
int ret = h*r/2;
return ret;
}


int main()
{
         int a=6;
cout<<"直径为6的圆的面积为:"<<area(a)<<endl;

cout<<"高为3底为2的三角形面积为:"<<area(3,2)<<endl;
cout<<"默认的三角形面积为:"<<area()<<endl;

system("pause");
return 0;
}

因为在主函数main()中area(6)[或者area(a)]的调用中,函数int area(const int &r)和int area(int h = 4,int r = 5)都是精确比配的函数,所以出现了二意性。

#6


你把程序改成下面这种就可以达到你的目的,但是我觉得别扭的要死,但愿你没有这种感觉!嘿嘿!

#include <iostream>
using namespace std;

int area(const int &r)
{
int a = r/2;
int ret = 3.14*a*a;
return ret;
}

int area(double h = 4,double r = 5)
{
int ret = h*r/2;
return ret;
}


int main()
{
         cout<<"直径为6的圆的面积为:"<<area(6)<<endl;
cout<<"高为3底为2的三角形面积为:"<<area(3,2)<<endl;
cout<<"默认的三角形面积为:"<<area()<<endl;

system("pause");
return 0;
}

#7


楼上兄弟讲得很细,很好,有空交流一下.

还有,我是来得分,我只要星星.

#8


谢谢大家说了这么多,也提出了不少解决方法,但是有一点我说得不太清楚,就是我们老师作业的要求:
面向对象程序设计第4周上机题

关于函数重载、缺省参数和引用的实验

写一个关于求面积的重载函数area(),分别能够求圆面积和三角形的面积,最后在main函数中输入参数并调用该函数,得出任意给定的圆或三角形的面积。

要求:1、求圆面积函数的参数为圆的直径的引用,并令其数据类型为整形,。
·在函数中试修改参数的值,并将修改后的值在main()函数中显示。
  2、求三角形面积函数的参数是其底和高,在此函数中出现缺省参数。 
·在main函数中用多种方式调用带缺省参数的area()函数。

目的:1、体会函数重载的意义和条件
  2、体会缺省参数的使用方法
      3、体会引用作为参数与直接传参数值的区别

#9


首先,程序并没有要求传递常量参数,所以改成变量就解决了。

第二,回答你的问题,area(6)
 在程序中被认为int area(int h = 4,int r = 5)的调用

其中  h=6,r=5

#10


#include <iostream>
using namespace std;

int area( int &r)
{
int a = r/2;
int ret = 3.14*a*a;
r=r+1;
return ret;
}

double area(double h = 4,double r = 5)
{
double ret = h*r/2;
return ret;
}


int main()
{

int r=6;
    cout<<"直径为6的圆的面积为:"<<area(r)<<endl;
cout<<"直径修改为:"<<r<<endl;
cout<<"高为3底为2的三角形面积为:"<<area(3,2)<<endl;

cout<<"高为3底为默认的三角形面积为:"<<area(3)<<endl;
cout<<"默认的三角形面积为:"<<area()<<endl;

system("pause");
return 0;
}