免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2007-05-16 10:14 |只看该作者
原帖由 思一克 于 2007-5-16 10:07 发表
C中返回STACK变量指针的危险和引用造成的危险和模糊不是一回事。


能否给个详细说明

论坛徽章:
0
12 [报告]
发表于 2007-05-16 10:21 |只看该作者
你说的这个(pi)我知道。

pi是返回的结果,我的意思是pi指的int住址是返回的结果。

这么说吧:

你调用了一个其他人编写的函数func(i, j);
你一定明白func不会对i,j造成改变。即使你不知道函数的原形。

但有引用的时候,完全不是这样了。

引用的使用使得程序的模块化结构变的不好。如同FORTRAN的模块化不如C好一样。因为一切都会变。



原帖由 ypxing 于 2007-5-16 10:12 发表


版主这个理解就不对,*pi而不是pi是返回的结果,pi也只是一个普通变量而已,它的值也不会变
这样可以看出指针给你造成了多大的影响。

要使i,j不变,你可以明确的将它们定义成const,不要要编译器猜你想干什么

论坛徽章:
0
13 [报告]
发表于 2007-05-16 10:31 |只看该作者
原帖由 思一克 于 2007-5-16 10:21 发表
你说的这个(pi)我知道。

pi是返回的结果,我的意思是pi指的int住址是返回的结果。

这么说吧:

你调用了一个其他人编写的函数func(i, j);
你一定明白func不会对i,j造成改变。即使你不知道函数的原形。
...


你的意思我很明白
一个新概念的出现有它的优点也有它的缺点,但是版主不能只看它带来的负面效应,
而且这个负面效应简直不值一提(因为你在调用一个函数后不想让i,j改变的话,更明确的做法是在调用前将i和j保存起来).

指针的滥用同样造成了很多的混乱,减少指针的使用可以在一定程度上改变这种状况.

很多bug,不是因为语言不好用,而是因为程序员的习惯不好造成的.

[ 本帖最后由 ypxing 于 2007-5-16 10:32 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2007-05-16 10:33 |只看该作者
原帖由 思一克 于 2007-5-16 10:21 发表
你说的这个(pi)我知道。

pi是返回的结果,我的意思是pi指的int住址是返回的结果。


版主当然会知道这个问题了
但是很多人是很迷惑的,一点也不差于对引用的迷惑

论坛徽章:
0
15 [报告]
发表于 2007-05-16 10:36 |只看该作者
我认为引用不是一个新东西。而是早期结构化程序比如FORTRAN等的一个固定的唯一的做法。
所以是一个老的传递方法。

而早期结构化程序不如C好的一个比较重要的因素就是引用传递的问题导致的一切都可以变。

至于C++中是不得已而引入的。如果不引入,C++的某些事情不好做。

论坛徽章:
0
16 [报告]
发表于 2007-05-16 10:41 |只看该作者
原帖由 思一克 于 2007-5-16 10:36 发表
我认为引用不是一个新东西。而是早期结构化程序比如FORTRAN等的一个固定的唯一的做法。
所以是一个老的传递方法。

而早期结构化程序不如C好的一个比较重要的因素就是引用传递的问题导致的一切都可以变。

至 ...


个人认为引用的意义还是很明确的

一个程序员在不了解一个函数时对它进行调用,
如果不想让参数改变,调用前就应该对参数进行保存.

不用引用,只用指针的话,比如void f(int *p)
你只知道p不变,而根本不知道*p会不会变
同样会造成你所说的一些问题
int i;
f(&i); /*调用后你也不知道i变不变,要想i不变,只能事先保存它,因为f不是你定义的,你不能改变它,
           只能使用它*/

[ 本帖最后由 ypxing 于 2007-5-16 10:50 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2007-05-16 10:44 |只看该作者
是这样的:

如果没有C的传递数值和传递地址概念,而如原来语言那样一切都是引用,那么引用也没有什么不明确的问题。
不好的问题是在C程序中才有所显现。

论坛徽章:
0
18 [报告]
发表于 2007-05-16 10:52 |只看该作者
原帖由 思一克 于 2007-5-16 10:44 发表
是这样的:

如果没有C的传递数值和传递地址概念,而如原来语言那样一切都是引用,那么引用也没有什么不明确的问题。
不好的问题是在C程序中才有所显现。


一个程序员在不了解一个函数时对它进行调用,
如果不想让参数改变,调用前就应该对参数进行保存.

不用引用,只用指针的话,比如void f(int *p)
你只知道p不变,而根本不知道*p会不会变
同样会造成你所说的一些问题
int i;
f(&i); /*调用后你也不知道i变不变,要想i不变,只能事先保存它,因为f不是你定义的,你不是很了解它,你不能改变它,
           只能使用它*/

[ 本帖最后由 ypxing 于 2007-5-16 10:56 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2007-05-16 10:57 |只看该作者
如果很多c++的编译器都把引用当指针来实现,那么在实现上引用不是新东西(哪些c++编译器不用指针实现引用?有知道的讲一下。)。我觉得引用在c++上主要是语意上的:1、不能空,2、必须初始化,3、不能改变。有的书把他叫别名。所以如果从下往上推,就失去这些语意了。

论坛徽章:
0
20 [报告]
发表于 2007-05-16 11:00 |只看该作者
原帖由 aXe 于 2007-5-16 10:57 发表
如果很多c++的编译器都把引用当指针来实现,那么在实现上引用不是新东西(哪些c++编译器不用指针实现引用?有知道的讲一下。)。我觉得引用在c++上主要是语意上的:1、不能空,2、必须初始化,3、不能改变。有的书 ...


是的,不能根据对引用的实现来反推引用的本质
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP