CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  新手乐园

函数重载混乱

楼主zhmh326(川添拓海)2006-03-11 09:11:33 在 C/C++ / 新手乐园 提问

老师给我们留的作业,要求我们写一个重载的小程序,有两个函数  
  int   area(int   &r)           //求圆面积  
  int   area(int   h   =   5,int   a   =   6)         //求三角形面积  
  可是我在main里无论怎么调用,求圆面积的函数怎么是不能被调用,请问怎么才能准确的调用这两个函数呢? 问题点数:10、回复次数:10Top

1 楼flyseahappy(花花世界)回复于 2006-03-11 09:19:31 得分 0

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

2 楼zhmh326(川添拓海)回复于 2006-03-11 09:27:04 得分 0

#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;  
  }  
   
  三次调用全都调用的第二个函数,怎么才能调用第一个呢?Top

3 楼njSeeWhy(北海鲲鹏)回复于 2006-03-11 10:32:31 得分 2

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

4 楼yyj1982(一切从头开始,好好学英语)回复于 2006-03-11 10:34:37 得分 5

我来回答你的问题吧!希望对你有帮助!  
   
  首先计算圆面积的函数定义有问题,问题在参数不应该声明为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;  
  }  
  通过了编译!Top

5 楼yyj1982(一切从头开始,好好学英语)回复于 2006-03-11 10:44:45 得分 2

你可能有疑问:为什么你上面给出的程序通过了编译?  
   
  那是因为你有两个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)都是精确比配的函数,所以出现了二意性。Top

6 楼yyj1982(一切从头开始,好好学英语)回复于 2006-03-11 10:56:26 得分 0

你把程序改成下面这种就可以达到你的目的,但是我觉得别扭的要死,但愿你没有这种感觉!嘿嘿!  
   
  #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;  
  }Top

7 楼SEUU(三枝花)回复于 2006-03-11 11:40:46 得分 0

楼上兄弟讲得很细,很好,有空交流一下.  
   
  还有,我是来得分,我只要星星.Top

8 楼zhmh326(川添拓海)回复于 2006-03-11 13:21:55 得分 0

谢谢大家说了这么多,也提出了不少解决方法,但是有一点我说得不太清楚,就是我们老师作业的要求:  
  面向对象程序设计第4周上机题  
   
  关于函数重载、缺省参数和引用的实验  
   
  写一个关于求面积的重载函数area(),分别能够求圆面积和三角形的面积,最后在main函数中输入参数并调用该函数,得出任意给定的圆或三角形的面积。  
   
  要求:1、求圆面积函数的参数为圆的直径的引用,并令其数据类型为整形,。  
  ·在函数中试修改参数的值,并将修改后的值在main()函数中显示。  
      2、求三角形面积函数的参数是其底和高,在此函数中出现缺省参数。    
  ·在main函数中用多种方式调用带缺省参数的area()函数。  
   
  目的:1、体会函数重载的意义和条件  
      2、体会缺省参数的使用方法  
              3、体会引用作为参数与直接传参数值的区别Top

9 楼xiongmao007()回复于 2006-03-11 13:58:38 得分 0

首先,程序并没有要求传递常量参数,所以改成变量就解决了。  
   
  第二,回答你的问题,area(6)  
    在程序中被认为int   area(int   h   =   4,int   r   =   5)的调用  
   
  其中     h=6,r=5  
   
  Top

10 楼xiongmao007()回复于 2006-03-11 14:10:12 得分 1

#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;  
  }  
   
  Top

相关问题

  • 函数重载
  • 函数重载?
  • 关于函数重载
  • 函数重载问题。
  • 函数重载问题
  • 怎么重载OnEraseBkgnd()函数??
  • 关于函数重载
  • 怎么重载函数?
  • 重载函数问题
  • 关于函数重载

关键词

  • 函数
  • ret
  • area
  • 调用
  • cout
  • 面积
  • double
  • main
  • usingnamespace std
  • const

得分解答快速导航

  • 帖主:zhmh326
  • njSeeWhy
  • yyj1982
  • yyj1982
  • xiongmao007

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo