C++で参照パラメータ(参照渡し)を使う方法をわかりやすく解説
C++では、変数の参照を関数に渡すことができます。この方法は一般に「参照渡し(Call by Reference)」と呼ばれます。
参照渡しとは、関数へ引数を渡す際に、引数そのものではなく「引数への参照」を仮引数にコピーする手法です。関数内部ではこの参照を通じて、呼び出し元で使われている実際の引数にアクセスします。そのため、関数内でパラメータに対して行った変更は、渡された元の変数にもそのまま反映されます。
値を参照渡しするには、通常の値と同じように引数の参照を関数へ渡します。ただしその場合、関数のパラメータを参照型として宣言する必要があります。次のswap()関数は、引数として受け取った2つの整数変数の値を入れ替える典型例です。
swap関数の定義例
// 値を入れ替える関数の定義
void swap(int &x, int &y) {
int temp;
temp = x; /* xの値を退避 */
x = y; /* yの値をxに代入 */
y = temp; /* 退避しておいた元のxの値をyに代入 */
return;
}それでは、このswap()関数を参照渡しで呼び出す完全なプログラムを見てみましょう。
プログラム全体の例
#include <iostream>
using namespace std;
// 関数の宣言
void swap(int &x, int &y);
int main () {
// ローカル変数の宣言
int a = 100;
int b = 200;
cout << "Before swap, value of a :" << a << endl;
cout << "Before swap, value of b :" << b << endl;
/* 変数の参照を使って値を入れ替える関数を呼び出す */
swap(a, b);
cout << "After swap, value of a :" << a << endl;
cout << "After swap, value of b :" << b << endl;
return 0;
}実行結果
Before swap, value of a :100 Before swap, value of b :200 After swap, value of a :200 After swap, value of b :100
実行結果から、swap()関数を呼び出した後にaとbの値が正しく入れ替わっていることが確認できます。これは、関数内のxとyが、それぞれaとbそのものを指している(エイリアスとして機能している)ためです。
参照渡しの主なメリット
- 関数内での変更が呼び出し元の変数に直接反映されるため、複数の結果を受け取りたい場合に便利
- 大きなオブジェクトや構造体をコピーせずに渡せるため、メモリと処理時間を節約できる
- ポインタのようにアドレス演算子(&)や間接演算子(*)を使わずに、通常の変数と同じ構文で扱えるため可読性が高い
なお、呼び出し元の値を変更してほしくない場合は、const参照(例:const int& x)を使うことで、コピーのコストを抑えつつ安全性を確保できます。
-
C#のメソッドにパラメーターを渡す方法とは?値渡しの仕組みとサンプルコード
C#でメソッドにパラメーターを渡す基本的な方法のひとつが「値渡し(値パラメーター)」です。この仕組みでは、メソッドが呼び出されると、各値パラメーターに対して新しいストレージ領域が作成されます。そして、呼び出し元の実際の引数の値がその新しい領域へコピーされます。そのため、メソッド内でパラメーターに対して行った変更は、呼び出し元の引数には一切影響しません。値渡しのポイントメソッド呼び出し時に、パラメーターごとに新しい記憶領域が確保される引数の値がコピーされるため、元の変数は保護されるメソッド内での変更は呼び出し元に反映されない以下は、メソッドにパラメーターを渡す動作を確認できるサンプルコードです。
-
C#で変数への参照を割り当てる方法|refキーワードの使い方
refキーワードによる参照渡しの基本C#で変数への参照を割り当てるには、refキーワードを使用します。参照パラメータとは、変数が格納されているメモリ上の場所への参照のことです。値渡しの場合とは異なり、参照渡しで引数を渡すときには新しいストレージ領域は作成されません。つまり、呼び出されたメソッドは呼び出し元の変数そのものを直接操作することになります。参照パラメータは、メソッドの宣言側と呼び出し側の両方でrefキーワードを使って指定する必要があります。値渡しとの違い通常の値渡しでは引数のコピーがメソッドに渡されるため、メソッド内で値を変更しても呼び出し元の変数には影響しません。一方、参照渡しでは変