Re: [問題] 一個很簡單程式問題

看板java作者 (godfat 真常)時間19年前 (2006/03/27 13:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串14/16 (看更多)
※ 引述《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
文章代碼(AID): #149tZIH2 (java)
討論串 (同標題文章)
文章代碼(AID): #149tZIH2 (java)