Re: [問題] 一個很簡單程式問題
※ 引述《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
討論串 (同標題文章)
java 近期熱門文章
PTT數位生活區 即時熱門文章