免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
41 [报告]
发表于 2007-05-16 12:12 |只看该作者
”你这种认识是制造bug的源泉“

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

论坛徽章:
0
42 [报告]
发表于 2007-05-16 12:18 |只看该作者
请大家使用引用的优点,
避免它的缺点,
如果调用一个函数不想让参数改变,请先保存,在恢复
如果不知道函数原型和实现,请默认参数是会改变的

这也算个小原则吧

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

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

不,我说的是这种认识:
即“有一些什么原则,然后想当然的认为所有人会遵守,...."

论坛徽章:
0
44 [报告]
发表于 2007-05-16 12:23 |只看该作者
原帖由 emacsnw 于 2007-5-16 11:47 发表


这样说的话,加const就一定有用吗?函数实现的时候还可以const_cast后继续修改参数。


是的,如果加上const_cast确实可以修改原本定义成const &的参数,
事无绝对,这里依靠程序员的良心和代码规范。
c/c++世界里,很多规则都可以人为打破的,不奇怪。对于故意打破规则捣乱的人,应该严惩不怠。

论坛徽章:
0
45 [报告]
发表于 2007-05-16 12:29 |只看该作者

  1. 1)早期的一切传递都是引用的结构化语言是结构不好的。因为变量不太分局部和全局。而且不能将函数认为是输入输出的黑盒子。任何参数都会被调用者修改。
复制代码


所以在某些公司的编程规范里,当你的函数不修改参数时,在参数列表中要加入const修饰来显式指定参数的不可变性.

引用在c++中引入,最初是为了解决诸如下标运算符重载等问题.比如

  1. class CharArray
  2. {
  3. public:
  4.     ....
  5.     char& operator[](int position);        //可用于表达式中的左值
  6.     const char& operator[](int position) const;
  7. private:
  8.     char* _datas;
  9. };
复制代码


不这么做的话,就不得不定义成员函数来完成类似功能.

另一个原因是考虑到性能,避免传值调用所引入的拷贝构造函数调用等开销.

另外,引用和其所引用对象间建立了唯一的联系.而指针并没有明确指定这种关系.

论坛徽章:
0
46 [报告]
发表于 2007-05-16 12:58 |只看该作者
原帖由 思一克 于 2007-5-16 12:00 发表
int func(int *i);
i 志向的地方可能变也可能不变,但是这是明显告诉你的,那里可能被修改。
引用就不同了,没有提供任何信息。除非你找到func本身



确实是

论坛徽章:
0
47 [报告]
发表于 2007-05-16 13:01 |只看该作者
下面的内容摘自 TCPL 5.5 References

A reference can be used to specify a function argument so that the function can change the value of an object passed to it. For example:


  1. void increment(int& aa)
  2. {
  3.         aa++;
  4. }

  5. void f()
  6. {
  7.         int x = 1;
  8.         increment(x); // x = 2
  9. }
复制代码


The semantics of argument passing are defined to be those of initialization, so when called, increment's argument aa became another name for x. To keep a program readable, it is often best to avoid functions that modify their arguments. Instead, you can return a value from the function explicitly or require a pointer argument:


  1. int next(int p)
  2. {
  3.         return p+1;
  4. }

  5. void incr(int* p)
  6. {
  7.         (*p)++;
  8. }

  9. void g()
  10. {
  11.         int x = 1;
  12.         increment(x); // x = 2
  13.         x = next(x); // x = 3
  14.         incr(&x); // x = 4
  15. }
复制代码


The increment(x) notation doesn't give a clue to the reader that x's value is being modified, the way x = next(x) and incr(&x) does. Consequently "plain" reference arguments should be used only where the name of the function gives a strong hint that the reference argument is modified.

[ 本帖最后由 I/0 于 2007-5-16 13:02 编辑 ]

论坛徽章:
0
48 [报告]
发表于 2007-05-16 14:21 |只看该作者
“A reference can be used to specify a function argument so that the function can change the value of an object passed to it. For example:



”To keep a program readable, it is often best to avoid functions that modify their arguments. Instead, you can return a value from the function explicitly or require a pointer argument:“

这里也是在建议,为让程序可读性高,最好避免使用引用,而代之以用函数返回数值或用指针显式地改变参数。

论坛徽章:
0
49 [报告]
发表于 2007-05-16 15:34 |只看该作者
原帖由 思一克 于 2007-5-16 09:16 发表
那么引用有好处吗?我个人意见,不多。除非万不得已非用不可,建议千万不要使用。
使用了,后果是让简单的程序无法读懂(不是因为引用概念复杂),尤其是分模块的情况下。


不敢苟同

楼主说的后果不是很严重嘛,因此我还是会继续使用refrence

那有不看函数原型就直接使用的?

实现同样的功能,不同的人写的函数原型就不一样,比如写个文件拷贝函数,

有人喜欢把 “源” 作为第2个参数,“目标”作为第1个参数,

也有人喜欢把 “源” 作为第1个参数,“目标”作为第2个参数.

如果用错了,只能说是有勇无谋;

另外,"后果是让简单的程序无法读懂" 这句话有点别扭,

我个人狭隘地认为,无法读懂的程序,应该不会简单

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

”下面的内容摘自 TCPL 5.5 References“
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP