
比較表:
比較基準 | Call_By_Value | 参照による呼び出し |
---|---|---|
基本 | 変数のコピーが渡されます。 | 変数自体が渡されます。 |
効果 | 変数のコピーを変更しても、関数の外側で変数の元の値は変更されません。 | 変数の変更は関数外の変数の値にも影響します。 |
呼び出しパラメータ | function_name(variable_name1、variable_name2、...); | function_name(&variable_name1、&variable_name2、...); //オブジェクトの場合 object.func_name(object); |
受信パラメータ | type function_name(タイプvariable_name1、タイプvariable_name2、...) {。 。 } | type function_name(タイプ* variable_name1、タイプ* variable_name2、...){。 。 } //オブジェクトの場合 タイプfunction_name(class_type object_name) {。 。 } |
デフォルトの通話 | プリミティブ型は「値による呼び出し」を使って渡されます。 | オブジェクトは「参照による呼び出し」を使用して暗黙的に渡されます。 |
値による呼び出しの定義
関数/メソッドにプリミティブデータ型(整数、文字、および文字列)を渡すと、その「値」だけが関数コードに渡されます。 関数は、引数のその値を機能コードの「仮パラメータ」にコピーします。 機能コード内の仮パラメーターに変更があったとしても、その機能を呼び出すために使用される引数の元の値は変更されません。
簡単に言うと、関数/メソッドが「値による呼び出し」アプローチで呼び出された場合。 その後、変数のコピーが機能コードに渡されます。 機能コードが変数のコピー内の値を変更しても、変数の元の値は変更されません。
これを簡単に理解するための例を見てみましょう。
// Javaクラスの例check {void change(int i、int j){i = i * i;} j = j / 2。 system.out.println( "関数内のパラメータの値"); system.out.println( "引数 'a'の値を受け付ける" iの値 "+ i); system.out.println( "引数 'b'の値を受け付ける 'j'の値" + j); call_by _value {public static void main(string args []){int a = 12、b = 20;}} チェックC = new check(); system.out.println( "関数呼び出し前の 'a'と 'b'の値" + a + "" + b); C.変化(a、b); C. //値で呼び出す system.out.println( "関数呼び出し後の 'a'と 'b'の値" + a + "" + b); 12関数呼び出し12の前に 'a'と 'b'の値を出力する引数 'a'の値を受け入れる 'i'の関数値の内側のparameterの値関数呼び出し12 20の後の引数 'b' 10 'a'と 'b'の値
参照による呼び出しの定義
参照による呼び出しメソッドは、引数の参照/アドレスを機能コードに渡します。 引数のアドレスが機能コードに渡されると、そのアドレスを受け入れる仮パラメーターは「ポインター」変数になります。 現在、機能コードが引数のアドレスを取得しているので、引数の値を変更すると、引数の元の値も変更されます。
C ++およびJavaでは、オブジェクトを関数/メソッドに渡すことが非常に一般的であり、オブジェクトは常にその参照によって渡されます。 関数/メソッド内のオブジェクトに対して行われた変更は、その関数/メソッドを呼び出すために使用されるオブジェクトに影響します。
次のフラグメントは、「参照による呼び出し」の正しい方法を示しています。
// C ++クラスの例swap {void swap(int * x、int * y){int temp;} temp = * x; * x = * y; * Y =温度。 int main {int a = 10、b = 20。 cout << "関数呼び出し前のa、bの値" << a << "" <それでは、引数として 'object'を渡すことによって 'reference by call'を議論しましょう。それは暗黙的に 'reference by call'というアプローチによって渡されます。
クラスチェック{int a、b;} check(int x、int b){//このコンストラクタを通して初期化されたオブジェクトa = x; b = y。 無効交換(obをチェック){ob.a = a * 2;} ob.b = b / 2。 クラスmain_class {public static void main(string args []){check C = new check(20, 40);} //オブジェクトの初期化 system.out.println( "関数呼び出し前の 'ob.a'と 'ob.b'の値" + ob.a + "" + ob.b); 交換(C); C. //参照して呼び出します。 system.out.println( "関数呼び出し前の 'ob.a'と 'ob.b'の値" + ob.a + "" + ob.b); 40関数呼び出し20の前に 'ob.a'と 'ob.b'の値を出力40 40関数呼び出し20の後に 'ob.a'と 'ob.b'の値に40 20値による呼び出しと参照による呼び出しの主な違い
- 「値による呼び出し」アプローチを使用して引数を渡すと、その変数のコピーのみが渡されるため、その変数のコピー内の値に加えた変更は、その変数の元の値には影響しません。 「参照による呼び出し」アプローチでは、変数自体が引数として渡されるため、それを変更すると元の変数の値が変更されます。
- 渡された引数がプリミティブデータ型である場合、それらは単に「値による呼び出し」ですが、引数またはオブジェクトの参照またはアドレスが渡される場合、関数は「参照による呼び出し」メソッドによって呼び出されます。
- 「値による呼び出し」アプローチでは、渡される引数は変数の名前だけですが、「参照による呼び出し」アプローチでは、「&」記号に沿った変数名、またはその名前だけで渡されるオブジェクトです。
- '値による呼び出し'アプローチで引数の引数を受け取ることは、そのデータ型と共に変数名です。 「参照による呼び出し」アプローチでは、受信側パラメータは常にデータ型とともにポインタ変数であり、オブジェクトの場合はクラス型とともにオブジェクト名です。
結論:
C ++とJavaは、渡されるものに応じて両方の方法を使用します。 変数の値のみを渡したい場合は、「値による呼び出し」アプローチを使用し、変数の元の値の変化を確認したい場合は、「参照による呼び出し」アプローチを使用します。