作者godfat (godfat 真常)
看板java
标题Re: [问题] 一个很简单程式问题
时间Mon Mar 27 14:04:17 2006
※ 引述《tkcn (小安)》之铭言:
: ---
: 不管是在 C++ 还是 JAVA,时常会出现 reference
: 这个名词,特性与 pointer 有些类似,那其中的
: 差别到底在哪呢?
其实这有点像是文字游戏的问题,
因为在 C++ 中所指的 reference 和在 Java 中所指的 reference
其实意思不太一样。就我的观念上,事实上 Java 的 reference type
就是一种阉割过的 pointer, 他缺乏的是运算能力,
例如对指标做某 offset 的运算,但是其他方面几乎都跟 pointer
是指同一件事了。Java 可以这样写:Something s = null;
但是 C++ reference 可不能够是 null, 因为 C++ 的 reference
其实是一种 alias, 你没有办法对 null 做 alias, 这是不被允许的。
: 其一是安全性。pointer 可以用加减法指向其他记
: 忆体位址(例如 *(pa+1) ),而在 reference 中这
: 是不被允许的。另外像是型别检查,pointer 无法
: 动态的检查所指向的位址是否为对应的型态,同样
: 的,在reference 中,这类问题也不会发生。
可以吧?不然 RTTI 是怎麽来的?
typeid 和 dynamic_cast<> 就是为此诞生的,
虽然我觉得这两个东西用处都不大。
因为一般而言设计上都会避免使用 RTTI
(error-prone, 还有 overhead 很大)
: 其二就是易用性。使用 reference 较 pointer 来
: 得直觉且方便,不需要加上繁杂的指标运算子。
: 而在实做上,其实 reference 骨子里仍然是透过
: pointer 达成目的,只是 compiler 将它包装起来
: ,让使用者看起来似乎是直接操作物件。
: 接下来是两个迷思,为什麽有人说
: "java 没有 pass by reference" 以及
: "c++ 没有 pass by address (pointer)"?
谁说 C++ 没有 pass by pointer???
基本上在 C 里面就是一直在用 pass by pointer,
只是在 C++ 中 pass by reference 比较方便,
所以 pass by pointer 变得很少使用。
但是有些时候还是得用 pass by pointer,
因为两者还是有很多差异,有时候就是会有限制。
: 其实这两者是相同的问题。
: 在 java 中,所有的物件变数都是 reference,而
: 在传递物件时,其实只是将 reference 所指向的
: 位址,复制到 formal parameter。所以对变数本
: 身而言,其实这只是 pass by value 而已。
: 同样的,在 c++ 中传递 pointer 时,对於指标本
: 身,也只是将位址复制给 formal parameter 罢了。
对,这不就是 pass by pointer 了?
C++ 另外还有 pass by reference,
那就是产生一个 alias, Java 中没有这种东西。
所以 Java always pass by value.
: 不过对於这两句话,我个人却有一点不同的看法。
: 对於变数本身来说,确实只是 pass by value,但
: 是之所以传递 reference 或着 pointer,目的也
: 都是为了操作物件。而以物件的角度来看,这样传
: 递参数的方式,确实是符合 pass by reference
: 或着 pass by address 的特性。所以个人认为,
: 不太需要拘泥於 "没有 pass by address" 这种说
: 词。
这边其实有名词上的问题…
台湾的书很喜欢这样写:
1. pass by value
2. pass by address
3. pass by reference
但是其实在国外,pass by address 几乎是 pass by reference
的同义字。也就是说,他们都算是一种 alias.
丢 pointer 这件事,其实根本就是 pass by value.
所以严格来说 C++ 只有两种呼叫法,by value 或 by reference
而 Java 则是只有 by value, 没有 by reference.
(我想是因为 alias 其实是一种危险的行为,所以 Java 不提供)
而这个 by value, 同时 always 指 C++ 的 by pointer,
差别在於没有指标运算能力,也没有繁复多余的语法。
说真的,不要太拘泥名词,因为每个人对这些名词定义都不太一样…
重点是观念要搞清楚,不要被混淆了
参考页面:
http://en.wikipedia.org/wiki/Evaluation_strategy
C++ 之所以难学又强大,就是因为他有很多特性,
这些其实都是两面刃,用得好就是强,用得差就是完蛋
: ---
: 有错请指正
一点想法
--
By Gamers, For Gamers - from the past Interplay
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.210.113