作者godfat (godfat 真常)
看板PLT
標題Re: [問題] 請問call by address
時間Tue Mar 20 21:38:02 2007
※ [本文轉錄自 java 看板]
作者: godfat (godfat 真常) 看板: java
標題: Re: [問題] 請問call by address
時間: Tue Mar 20 20:12:36 2007
根據 wikipedia,
http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference
...總覺得這頁長得好像跟以前不一樣?
我記得以前是說 call by address 是 call by reference 的另一種說法
也就是說,兩件事是指同一件事
現在看起來 call by address 又是 call by reference 的變形了
其實我只是想說,名詞不太重要,不是因為他真的不重要,
而是說法真的是太多種了|||b
所以呢,知道是什麼事情就好了… :(
以 Java 來說的話,variable 本身不能被 alias, 意思就是
每一個 call 都只能傳遞 variable 本身的複製。
以 C++ 來說的話,上面那件事跟把 pointer copy 傳過去是同一件事
然後額外還有個 call by reference 就是替 variable 做 alias...
Java:
void f(Object of){
of = null;
}
void g(){
Object og = new Object();
f(og);
out.println(og);
}
則 instance 只有一份,Object variable 有兩份,of 和 og 是不同的
對 of 操作不會影響到 og, 經過 f(og); 後 og 還是指向該 instance.
Java 永遠只有這種操作
C++:
void f(Object* of){
of = NULL;
}
void g(){
Object* og = new Object;
f(og);
cout << og << endl;
}
上面這段意思跟 Java 一樣,但另外還有:
void f(Object*& of){
of = NULL;
}
只在參數列那邊多加了個 &, 這樣就是 pointer reference,
of 和 og 可以視為同一個 pointer, 所以 f(og); 後,og 會變 NULL
還有很多其他的變形,例如:
void f(Object of);
void f(Object** of);
void f(Object**& of);
void f(Object************************************************** of);
在 Java 板就不說太多了 XD
--
In Lisp, you don't just write your program down toward the language,
you also build the language up toward your program.
《Programming Bottom-Up》- Paul Graham 1993
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.58.12
1F:推 PsMonkey:轉去 PLT 討論如何? 03/20 20:35
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.30.220