免费注册 查看新帖 |

Chinaunix

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

[C++] 你们的代码会用引用吗? [复制链接]

论坛徽章:
0
131 [报告]
发表于 2008-11-27 11:12 |只看该作者
原帖由 sbc19861004 于 2008-11-27 09:57 发表


那你有没有联想到这种情况,一个地址代表长10米的墙,你强制转换成一只长1米的羊,你对这个地址++,现在这个地址是什么,它有什么意义。
引用的基本观点,结构是原子的,对结构的转换只是更换结构对外的表 ...


程序最重要的是逻辑,逻辑不清的程序是有病的程序。
比如说“=”号,一个量与另一个量建立相等关系,前提必须是(显式或隐式的)单位相等。
在C++里,有很多这样有病的语义逻辑!(时间关系,我就不一一列举了) 用C++写出逻辑完全健康的软件很难,尤其是复杂的软件!这点普通程序员通常感觉不到,一旦出现问题,他(她)们往往自责自己对C++学得不够。其实道理很简单,有病的土壤能长出美丽健康的花果吗?

论坛徽章:
0
132 [报告]
发表于 2008-11-27 12:01 |只看该作者
说这些话还为时过早。。。

论坛徽章:
0
133 [报告]
发表于 2008-11-27 13:24 |只看该作者
原帖由 newcuusre 于 2008-11-27 11:12 发表


程序最重要的是逻辑,逻辑不清的程序是有病的程序。
比如说“=”号,一个量与另一个量建立相等关系,前提必须是(显式或隐式的)单位相等。
在C++里,有很多这样有病的语义逻辑!(时间关系,我就不一一 ...

你说的相等关系是指赋值吧。隐式或显示的类型相等,这个当然,这是赋值号的语义。引用在这方面其实比指针好,
引用是规定转换规则的,不满足转换规则的是不可以赋值的,如:
class a {
....
};

class b {
....
}
class c: public a {
....
};

c testc;
a &testa =c; 这是成立的,因为这个规则是在继承时规定的,而且是安全的,就像一台电脑可以(c的新方法)听音乐又可以(a中继承的方法)编辑文档,而我们只拿它(指为a的引用)编辑文档一样。
而:
b &testb = c;是不成立的,因为这种转换规则是不存在的。

而指针是不规定转换规则的,如:
c *testc = new c();
a *testa = c;
b *testb = c;
这些都是编译器允许的,因为指针的类型是通用的(size_t),好的编译器在这种情况下会有警告,这是编译时检查指针的声明类型不相同引起的。但肯定只是警告,因为以上的写法是指针正确的语义。
这时候如果使用testb,结果是不可预期的。
你说到“在C++里,有很多这样有病的语义逻辑!”,可以的话还是举几个例子吧

论坛徽章:
0
134 [报告]
发表于 2008-11-27 15:30 |只看该作者
引用就是给指针用上紧箍咒,两者各有各的长处,都是传址。不是说引用万能,但是能轻松化解野指针问题,图的就是个方便。

论坛徽章:
0
135 [报告]
发表于 2008-11-27 15:39 |只看该作者

回复 #133 sbc19861004 的帖子

描述一个事物过程:选择一种语言,在这种语言里寻找恰当的词,用选好的词语构造句子。
如果在第一步你选择是一种散漫不够严谨的语言,它允许你随意造词,后果会是什么?别人不明白或误解你的描述。
C++就是这样散漫的语言!比如你提到的有继承关系的对象就可随意互相赋值,这是C++自作多情地把赋值和相等的概念加了新意!还有如运算符重载,访问控制符private、protected ... 很多都是C++的东西。

论坛徽章:
0
136 [报告]
发表于 2008-11-27 19:09 |只看该作者
其实引用应该算是一种特殊化的指针。

比较指针和引用的用途,很明显指针比引用可以做更多的事,用途自然也就比引用更广。而其中特别有一点,是指针的本质特性所带来的最大优点——那就是将一个结构体做为参数在函数间传递的时候不需要产生副本,这使代码的执行效率能够大大地提高。

但是随着指针被广泛地用于在函数间传递参数,就使得代码中充满了 p->XXX 这样的东西,但是这些地方的指针除了利用指针“传递地址的高效率”这一特性以外并不做其他的事,而且在这种情况下对函数的 call 和在被调用函数中处理参数的时候代码的写法都变得比传值更复杂。在这种情况下才有了引用。

引用其本身的意义不在于他的物理性质(即本体就是指针的本质),而在于他所表示的逻辑意义。当你使用引用的时候,实际上你的意思是“我操作的就是那个变量本身”,而不是其他的什么东西——既不是他的副本也不是他的地址。

所以,指针和引用的区别,其重点应该表现在他们表面的逻辑意义上,而不是他们的性能差别如何。

另一个支持这种说法的事实是,当你对一个引用取地址时,实际上你得到的是这个引用所引之变量的地址:


地球人都知道,引用是没有地址可取的,但是实际上对引用取地址的操作却是合法的,而且取回的地址是被引用的变量的地址,这已经充分说明了“引用就是变量的一个别名”的逻辑意义了。

因此结论就是,当你的意图是想要对被引用(或者指针指向)的变量本身采取某种动作的时候,那么就用引用;而当你的意图是想对这个变量在“物理意义”上实施某种动作的时候,那么就应该用指针。

[ 本帖最后由 wsz123 于 2008-11-28 00:33 编辑 ]

论坛徽章:
0
137 [报告]
发表于 2008-11-27 21:15 |只看该作者
原帖由 newcuusre 于 2008-11-27 15:39 发表
描述一个事物过程:选择一种语言,在这种语言里寻找恰当的词,用选好的词语构造句子。
如果在第一步你选择是一种散漫不够严谨的语言,它允许你随意造词,后果会是什么?别人不明白或误解你的描述。
C++就是这 ...


你的随意造词是指创建对象吗?这是面向对象最基本的特性,也是一种描述世界的方法。
至于运算符重载,这也可以理解。新的对象出现了,对它的操作使用的符号自然要具有自己新的意思。当然这种方法增加了对新对象的理解和使用难度。但这东西就像“黔之驴”一样,你不知道它为什么叫,怎么样踢的时候,怎么敢吃它?
至于public,private是c++的东西不恰恰说明它更好的划分了层次吗?
你的回帖中太多是没有证明就下结论的话(诚如“如果在第一步你选择是一种散漫不够严谨的语言,它允许你随意造词,后果会是什么?别人不明白或误解你的描述。C++就是这样一种语言。”)。希望我们的讨论是“因为证明,所以结论”式的,而不是“因为结论,所以结论”式的。

顺便说一句,大家不是讨论指针和引用吗?怎么跑到c++语言好不好上面了?!

论坛徽章:
0
138 [报告]
发表于 2008-11-27 21:17 |只看该作者
原帖由 wsz123 于 2008-11-27 19:09 发表
其实引用应该算是一种特殊化的指针。

比较指针的引用的用途,很明显指针比引用可以做更多的事,用途自然也就比引用更广。而其中特别有一点,是指针的本质特性所带来的最大优点——那就是将一个结构体做为参数 ...


支持这个说法

论坛徽章:
0
139 [报告]
发表于 2008-11-28 09:13 |只看该作者

回复 #137 sbc19861004 的帖子

高度概括地讲述,你的确理解很吃力。

论坛徽章:
0
140 [报告]
发表于 2008-11-28 14:17 |只看该作者
指针还要判断是否空指针野指针,引用不需要
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP