免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 思一克
打印 上一主题 下一主题

[C++] C++的引用的传递和返回兼批判 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2007-05-16 15:45 |只看该作者
原帖由 思一克 于 2007-5-16 15:39 发表
引用使得程序readable 变差,以下书中英语也是这么说的: (I/O 的引用)

”下面的内容摘自 TCPL 5.5 References“


引用也有使readable变得好的情况,呵呵

论坛徽章:
0
52 [报告]
发表于 2007-05-16 15:48 |只看该作者
原帖由 ypxing 于 2007-5-16 15:45 发表


引用也有使readable变得好的情况,呵呵


引用作为参数,相比指针,
可以不需要判断 if (pointer == NULL),使程序更简洁。

论坛徽章:
0
53 [报告]
发表于 2007-05-16 15:56 |只看该作者
引用的本质就是指针。肯定有某些好处和必要性,在C++中。

但是2个坏处是影响最大的
1)程序可读性差。
2)模块结构差。

我的意思是要注意这2个坏处。还有要注意的是,本来是C程序,千万不要为了C++,用G++编译,再使用上象引用这样的扩展。如果那样,程序只能变的更糟。

如果程序一开始就是C++的,那当然不在我说的范围之内。该使用当然要用。

论坛徽章:
0
54 [报告]
发表于 2007-05-16 16:15 |只看该作者
原帖由 思一克 于 2007-5-16 12:12 发表
”你这种认识是制造bug的源泉“

该点引用应该远高于指针。想想所有传递都是引用的语言会是怎样的情形。



java不就是全都是引用么

论坛徽章:
0
55 [报告]
发表于 2007-05-16 16:26 |只看该作者
原帖由 思一克 于 2007-5-16 15:56 发表
引用的本质就是指针。肯定有某些好处和必要性,在C++中。

但是2个坏处是影响最大的
1)程序可读性差。
2)模块结构差。

我的意思是要注意这2个坏处。还有要注意的是,本来是C程序,千万不要为了C++,用G+ ...

我们可以使用指针、引用、宏三种方式实现交换两个数的功能,如下所示:

  1. 使用引用,代码较简洁
  2. void swap(int & a, int & b)
  3. {
  4.    int temp = a;
  5.    a = b;
  6.    b = temp;
  7. }

  8. 使用指针,代码不直观
  9. void swap(int * a, int * b)
  10. {
  11.    int temp = *a;
  12.    *a = *b;
  13.    *b = temp;
  14. }
复制代码

当我还是一个对地址概念不清楚的C语言初学者的时候,我觉得使用"引用"实现的swap比使用指针实现的swap的可读性要好一点。但是在熟悉了指针后,我倾向于使用指针实现swap函数,原因在于:如果用指针实现swap函数,调用swap函数的语句为swap(&a, &b),提醒程序员a、b的值有可能发生改变;而如果使用引用实现swap函数,调用swap函数的语句为swap(a, b),程序员有可能误认为a、b的值没有发生变化。

论坛徽章:
0
56 [报告]
发表于 2007-05-16 16:44 |只看该作者
C#中引入了ref关键字用来指定参数的传递方式:传址(by reference),值得注意的是,C#要求函数被调用的地方显式的使用ref关键字修饰被传递的参数,以下使用C#语言实现了Swap函数:
using System;
class Test
{
      函数定义部分申明i和j的参数传递方式为传址(by reference)
    static void Swap(ref int x, ref int y)
    {
     int temp = x;
      x = y;
          y = temp;
   }

   static void Main()
   {
     int i = 1, j = 2;
          在函数被调用的地方显式的使用ref关键字修饰被传递的参数
     Swap(ref i, ref j);
     Console.WriteLine("i = {0}, j = {1}", i, j);           
   }
}
程序结果:
i = 2, j = 1


程序员看到这条语句
Swap(ref i, ref j);

就可以意识到i和j的值可能发生变化。

[ 本帖最后由 missjiang 于 2007-5-16 16:58 编辑 ]

论坛徽章:
0
57 [报告]
发表于 2007-05-16 16:48 |只看该作者
BZ提的问题还是很有意义的,BZ自己给自己加个精吧,内举不避亲,呵呵。

论坛徽章:
0
58 [报告]
发表于 2007-05-16 19:27 |只看该作者
谢谢.加精倒不用.

我出此贴目的主要目的不是为了批判引用,而是看引用的本质:

如果func(TYPE &i)定义了,那么
func(i);
本质上传递(放到STACK上的)给func的是i的地址,而不是i的数值本身.虽然写的是i

如果int &func()定义了,那么
i = func();
本质上func返回(通过DX,AX回送的)的是一个指针. 而i = 将该指针的内容取出给i.


从编译后的汇编层面上,引用和指针一样.


所以可以说引用是编译器对指针进行的伪装或叫封装. 这一伪装,使一些学C的人因为有了指针数值概念而感有些疑惑.

如果本贴可以解释这封装,就已经达到目的.

感谢以上的批评,质疑和评价.





原帖由 missjiang 于 2007-5-16 16:48 发表
BZ提的问题还是很有意义的,BZ自己给自己加个精吧,内举不避亲,呵呵。

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
59 [报告]
发表于 2007-05-16 22:25 |只看该作者
引用的本质就是指针, 不但要用,而且要坚持用,越用越好用,不用白不用,用了也白用,看不明白拉倒,反正我能看明白就行拉.

论坛徽章:
0
60 [报告]
发表于 2007-05-17 00:08 |只看该作者
反正我就觉得C++这个传引用很废,换句话说,鸡肋。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP