「参照」の定義を与えずに、「参照渡し」が本当に「値渡し参照」であるとは言えません。
Javaでは、呼び出しで渡されたパラメーターの値を変更せずに、関数内で参照である仮パラメーターの値を変更できるため、ステートメントは true (最初はおおよそ) です。
void f(Object param) {
param = null;
}
void g() {
Object o = new Object();
System.out.println(o);
f(o);
System.out.printn(o);
}
2 つの print ステートメントがまったく同じ結果になることは誰もが知っています。実際、Javaには参照渡しはなく、渡すことができるのは参照のみです。引数を渡す方法は 1 つしかありません: 値渡しです。
C++ では、これはまったく異なります。関数内の参照パラメーターの値を変更すると、呼び出しで渡されるパラメーターが変更されます。
void f(int ¶m) {
param = 0;
}
void g() {
int i=12;
cout << i << endl;
f(i);
cout << i << endl;
}
すべての C++ プログラマーは、2 番目の出力が 0 を表示することを知っています (最初の出力は 12 です)。
したがって、C++ では、「参照渡し」が「参照を値渡し」であるとは言えません。C++ 参照には値がなく、メモリ チャンクに関連付けられた名前にすぎません (標準セクション 8.3.2 参照: [注: 参照はオブジェクトの名前と考えることができます。—終了注] )。内部f()
には、2 つの名前を持つ変数が 1 つだけあります。もちろん、C++ 参照の実装のほとんどが隠しポインターであることに異議を唱えるかもしれません。ただし、非表示のポインターを使用して参照を実装することを回避できる場合が多いことに注意する必要があります (標準セクション 8.3.2/7 参照。参照にストレージが必要かどうかは指定されていません)...したがって、C++ ではステートメントは次のようになります。有効ではありません。C++ には、パラメータを渡す方法が 2 つあります。値による方法と参照による方法です。