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灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP