作者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