java 板


LINE

※ 引述《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







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP