CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

学C++,遇到两个小问题,请指点~

楼主cheng19long(龙仔)2005-05-19 10:11:47 在 C/C++ / C++ 语言 提问

问题一:  
  //   p1-851.cpp   为main()函数文件  
  #include<iostream.h>  
  main()  
  {  
          int   i,s=0;  
          extern   int   fact(int   x);  
          for   (i=2;i<=6;i=i+2)  
                  s+=fact(i);  
          cout<<"s="<<s<<endl;  
  }  
  //   p1-852.cpp为计算阶乘函数文件  
  //定义fact()函数为外部(extern)函数  
  extern   int   fact(int   x)      
  {  
          int   i,t=1;  
          if(x==0)   return(1);  
          for(i=1;i<=x;i++)  
                  t*=i;  
          return(t);  
  }  
   
  如何用VC编多个源程序文件?选择--win32   console   Application   然后呢?书上没说完,请高手指点啊~  
   
  问题二:  
   
  书生在线   09:19:54  
  student&     max(student   &x,student   &y)             //swap的参数为引用传递方式  
  {  
          return   (x.grade>y.grade?x:y);  
  }  
   
   
  student       max(student   &x,student   &y)             //去掉student   max的引用,会怎么样呢?  
  {  
          return   (x.grade>y.grade?x:y);  
  }  
   
  这两个函数在使用有什么不同?    
  问题点数:20、回复次数:17Top

1 楼cheng19long(龙仔)回复于 2005-05-19 10:48:44 得分 0

up~~高手帮我啊~Top

2 楼zsal(zsal)回复于 2005-05-19 10:54:34 得分 3

新建空白工程:  
  FILE   ->   new,   projects   ->   win32   console   Application,   An   empty   project   ->   Finish.  
   
  添加源文件:  
  FILE   ->   new,   Files   ->   C++   source   file,   File   name:   main.cpp   ->   OK.  
  FILE   ->   new,   Files   ->   C++   source   file,   File   name:   fact.cpp   ->   OK.  
   
  编译,运行。Top

3 楼predrag(Peja)回复于 2005-05-19 10:54:58 得分 1

我觉得第2个问题,用引用比较高效Top

4 楼zsal(zsal)回复于 2005-05-19 11:09:33 得分 10

问题二:  
  第二个函数是否为:  
  student       max(student   x,student   y)             //去掉student   max的引用,会怎么样呢?  
  {  
          return   (x.grade>y.grade?x:y);  
  }  
   
  区别在于,参数传递或返回值返回时,默认是值拷贝的,这样如果对象很大时,效率较低,所以引入了引用的概念,这样只拷贝对象的地址,提高了效率。  
   
  另外如果不想修改参数值,使用引用参数时,最好用const:  
  student&     max(const   student   &x,const   student   &y)             //swap的参数为引用传递方式  
  {  
          //  
  }  
   
  Top

5 楼cheng19long(龙仔)回复于 2005-05-19 11:22:59 得分 0

zsal(zsal)   (   )   信誉:100     2005-05-19   10:54:00     得分:   0      
     
     
        新建空白工程:  
  FILE   ->   new,   projects   ->   win32   console   Application,   An   empty   project   ->   Finish.  
   
  添加源文件:  
  FILE   ->   new,   Files   ->   C++   source   file,   File   name:   main.cpp   ->   OK.  
  FILE   ->   new,   Files   ->   C++   source   file,   File   name:   fact.cpp   ->   OK.  
   
  编译,运行。  
      -----------------------------------------  
   
  多谢了,成功运行~~  
   
  ========================================  
    predrag(Peja)   (   )   信誉:100     2005-05-19   10:54:00     得分:   0      
     
     
        我觉得第2个问题,用引用比较高效  
       
     
  -----------------------------------------  
  好像前面调用他的时候有个固定的格式:  
  student   t   =   max(a,b);  
     
  student&     max(student   &x,student   &y)       只是高效?也就是说以后用到的函数里能引用,就引用 ?是这样的吗?Top

6 楼pincer(无关紧要)回复于 2005-05-19 11:26:38 得分 1

尽量以const&的方式而不是传值方式来传递对象,这样会减少临时对象的产生,比较高效Top

7 楼Beover1984(摇滚人生)回复于 2005-05-19 11:37:19 得分 0

#include<iostream.h>  
  main()  
  {  
          int   i,s=0;  
          extern   int   fact(int   x);           //extern       可以用在main中吗?  
          for   (i=2;i<=6;i=i+2)  
                  s+=fact(i);  
          cout<<"s="<<s<<endl;  
  }  
   
  应该是这样吧:  
  #include<iostream.h>  
   
  extern   int   fact(int   x);  
   
  main()  
  {  
          int   i,s=0;  
                  for   (i=2;i<=6;i=i+2)  
                  s+=fact(i);  
          cout<<"s="<<s<<endl;  
  }  
   
  Top

8 楼cheng19long(龙仔)回复于 2005-05-19 11:59:02 得分 0

不知楼上的程序如何运行,我是直接复制过去,有两个main,怎么行啊?Top

9 楼djfu(飞龙在天)回复于 2005-05-19 12:56:21 得分 2

问题二:  
  第二个函数是否为:  
  student       max(student   x,student   y)             //去掉student   max的引用,会怎么样呢?  
  {  
          return   (x.grade>y.grade?x:y);  
  }  
   
  区别在于,参数传递或返回值返回时,默认是值拷贝的,这样如果对象很大时,效率较低,所以引入了引用的概念,这样只拷贝对象的地址,提高了效率。  
  ---------------------------------------  
   
  其实这样的高效对于内置的数据类型(built-in   types),几乎对效率没有什么影响。  
  它的高效是相对于一些类对象和一些大的对象来说的。  
   
  Top

10 楼djfu(飞龙在天)回复于 2005-05-19 12:57:33 得分 1

不知楼上的程序如何运行,我是直接复制过去,有两个main,怎么行啊?  
  ------------------------------------  
  我真是服了你了,  
   
  #include<iostream.h>  
   
  extern   int   fact(int   x);  
   
  main()  
  {  
          int   i,s=0;  
                  for   (i=2;i<=6;i=i+2)  
                  s+=fact(i);  
          cout<<"s="<<s<<endl;  
  }  
   
  才是他给的代码,前面一个是纠正上面的人说的示例。Top

11 楼flyingdancing2005(返璞归C)回复于 2005-05-19 13:06:13 得分 0

有意思..............Top

12 楼ksndyjs()回复于 2005-05-19 13:22:46 得分 2

关于第二个问题,主要是效率的问题,并因此会引出一系列问题比如:  
   
  int   u   =   10;  
  int&   s()  
  {  
        return   u;  
  }  
  void   main()  
  {  
          int   y   =   s();  
          y   =   10;       //if   the   reference   is   used   for   the   return   value   of   s(),  
                              //then   u   =10,otherwise,the   u   remains   no   changed.  
  }  
  总之记住,引用永远都是另外一个变量的别名而已。如果另外一个变量没有了,那它的引用也不能再用了。所以不要返回栈上变量的引用。Top

13 楼lyld3618(核桃)回复于 2005-05-19 13:35:23 得分 0

上面说得都对!Top

14 楼cheng19long(龙仔)回复于 2005-05-19 16:18:21 得分 0

楼上的楼上,能不能给我一段程序,说明,有和没有的区别,你写的那个英文:  
   
  据我翻译是这样的:如果引用作为s()的返回值,那么u等于10,否则,u   没有改变  
  include   <iostream.h>  
   
  int   u   =   10;  
  int     s()  
  {  
        return   u;  
  }  
  void   main()  
  {  
          int   y   =   s();  
  cout   <<   y   <<'\t'   <<   u   <<     endl;  
          y   =   5;       //if   the   reference   is   used   for   the   return   value   of   s(),  
                              //then   u   =10,otherwise,the   u   remains   no   changed.  
  cout   <<   y   <<'\t'   <<   u   <<     endl;  
  }  
  这是我写的,我真的看不出来,要和不要有什么区别~,请指点~Top

15 楼zsal(zsal)回复于 2005-05-19 17:25:52 得分 0

#include   <iostream.h>  
   
  int   u   =   10;  
  int   s()  
  {  
  return   u;  
  }  
  int   &t()  
  {  
  return   u;  
  }  
  void   main()  
  {  
          int   y   =   s();  
  cout   <<   y   <<'\t'   <<   u   <<     endl; //10 10  
          y   =   5;  
  cout   <<   y   <<'\t'   <<   u   <<     endl; //5 10  
   
  int   &z   =   t();  
  cout   <<   z   <<'\t'   <<   u   <<     endl; //10 10  
          z   =   5;  
  cout   <<   z   <<'\t'   <<   u   <<     endl; //5 5  
   
  }  
  Top

16 楼cheng19long(龙仔)回复于 2005-05-19 17:58:37 得分 0

楼上的高手,是不是是:  
   
  int   &t()  
  {  
  return   u;  
  }  
   
  int   &z   =   t();  
  这两个地方,要一致,才有效,如果只是int    z   =   t();不能实现上面的功能  
   
  如果说程序中有:  
   
  student&     max(student   &x,student   &y)             //swap的参数为引用传递方式  
  {  
          return   (x.grade>y.grade?x:y);  
  }  
   
  student   t=max(a,b);  
          cout<<"Max:";  
   
  这里,程序并没有在t上加一个&,所以我认识这里面加不都一样~  
  现在我都越问越糊涂了...  
  Top

17 楼zsal(zsal)回复于 2005-05-19 18:26:16 得分 0

int   w   =   t();  
  这里w是int型,只是值拷贝,地址并不会改变,所以w与u不是同一块内存,相互之间不影响。  
  int   &z   =   t();  
  这里z是int&型,也就是引用型,引用做的是地址拷贝,这时,z与u的地址是相同的,也就是说,z相当于u的别名,而且引用型定义时必须被初始化,一旦初始化它的地址将不能被改变,也就不能再指向另一个变量了。Top

相关问题

  • 刚开始学C++,遇到问题了,请高人指点下
  • 在C++学习过程中遇到的小问题,希望各位指点一二
  • 遇到一个PRO*C预编译错误,请指点!
  • 初学servlet遇到的困难,请各位指点指点
  • 我现在想学C++。高手指点!
  • 刚学C#,有一不懂!望指点
  • 初学c++,请高手指点一下!
  • 初学V C 高手指点 急
  • 想学C++,请大家指点方向!
  • 想学C++,请大家指点方向!

关键词

  • c++
  • win32
  • 函数
  • cpp
  • source
  • 引用
  • student
  • 对象
  • grade
  • 参数

得分解答快速导航

  • 帖主:cheng19long
  • zsal
  • predrag
  • zsal
  • pincer
  • djfu
  • djfu
  • ksndyjs

相关链接

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

广告也精彩

反馈

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