Java の値転送についての理解:
コード 1:
public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer = new StringBuffer("colin"); System.out.println(buffer); public static void SChange (StringBuffer str) { str= new StringBuffer("huang") } }コード 2:
public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer = new StringBuffer("colin"); System.out.println(buffer); public static void SChange (StringBuffer str) { //str= new StringBuffer("huang"); } }2 つの図を使用して、上記のコード 1 とコード 2 をそれぞれ説明しましょう。
元の状態
コード 1 の図:
コード 2 の理解:
コード 1 では、コピー参照は新しいオブジェクトを指します。 ただし、元のオブジェクトは変更されません。
コード 2 では、コピー参照によって元のオブジェクトが変更されます。
これは Java の値渡しです。
C++ における 2 種類の転送の違いは次のとおりです。
C++ 値の受け渡し、参照の受け渡し、およびポインター メソッドの場合は、次のコードを使用してテストを理解し、自分で実行します。
#include <stdio.h> #include <iostream> #include <typeinfo> void ByValue(int a) { a = a + 1; } void ByRef(int& a) { a = a + 1; } void ByPointer(int*) a) { *a = *a + 1; } int main(int argv, char** args) { int v = 1; ByRef(v); // 参照渡し ByPointer(&v); // 値渡し int* vp = &v; std::cout << std::endl; cout << typeid(vp).name() << std::endl; // std::cout << typeid(&vp).name() << std::endl; std::cout << "end" << std::endl;最初の関数は値渡しで、2 番目の関数は参照渡しですが、後の 2 つの関数では、同じ関数が参照呼び出しで 1 回呼び出され、値渡しで 1 回呼び出されます。
なぜなら:
ByPointer(vp); vp が変更されていない場合は変更できません。値渡し
ByPointer(&v) の変更 v。参照渡し (実際に渡されるのは v のアドレスであり、ByPointer は v のアドレスを変更できないため、これは値による呼び出しです。これは自明のことですが、v のアドレスは純粋なデータです。呼び出し側には v だけがあり、v は実際に ByPointer 関数によって変更されます。この結果はまさに Call by です。参照の行動を考慮することが評価戦略の本来の目的であり、すべてを値に抽象化し、データの観点から問題を考慮するのであれば、聴衆を混乱させる評価戦略の概念を導入する必要はありません。 )
nob: 上記の理解は、値の受け渡し: ポインターの受け渡し、typeid(x).name() を使用する場合の参照の受け渡しの 2 つの方法で使用できます。 &v と vp を表示すると、どちらもポイント タイプであることがわかり、2 つのパフォーマンスで同じ結果が得られます。あなたは私のことをこう思っているかもしれません
ByValue(&v); //エラー
ただし、C++ で異なる型のパラメータを渡すと、コンパイルは直接渡されません。
要約:
したがって、値渡しまたは参照渡しの場合は、それがメモリ内でどのように行われるかを確認するだけでよいと思います。
メモリの共有は参照を渡すことを意味し、メモリのコピーは値を渡すことを意味します (いくつかの特殊なケースを先に置いておきます)
この場合:
C/C++: デフォルトで値渡し、参照渡し、およびポインターは個別に理解されます (ポインターは値渡しまたは参照渡しとして理解でき、結果は同じです)。
JAVA: 基本データ型は値によって渡され、オブジェクトも値によって渡されます (このオブジェクトの参照をコピーします)。
C#: 値の型による値の受け渡し、参照型による参照による受け渡し、ref/out の特別な理解
JAVA と C# の文字列は、見た目は値渡しですが、実際の実装は仮想マシンに依存します。