参照とは
C++はポインタに加えて、参照という便利な機能をもっています。エイリアスともいいます。
ポインタを使って元の値を見るとき、「*」や「&」を使ったり「.」を「->」に換えたりと煩わしい文法が多くて大変ですよね。(詳しくはポインタを参照)
参照を使うとこの表記の煩雑さを解決することができます。
使い方を見てみましょう。
【参照の型】 &【参照名】 = 【参照したい変数名】
&が出てきますがここだけです。
例えばint型の変数iの参照riは
reff_sample1.cpp
int i;
int &ri = i;
となります。
注意点は宣言と同時に初期化しないといけないことです。
つまり、
reff_sample2.cpp
int i;
int &ri;
ri = i;
このような書き方はコンパイルエラーになります。
面倒なような気がしますが、実はこれにはメリットがあります。
それはNULLポインタにならない点です。
初期化しなければならないので参照は必ずいずれかの変数を指しています。
参照は変数と同様に使うことができます。
reff_sample3.cpp
cout << i; cout << ri;
この2行は同じ結果を示します。
ポインタを参照に書き換える
これだけでは効果がわかりにくいですね。
ここで実例を示しましょう。
ポインタを引数にした関数を参照を使って書き換えます。
reff_sample4.cpp
void MySwap(int *x, int *y)
{
int buf = *x;
*x = *y;
*y = buf;
}
ポインタと関数で紹介した2変数を入れ替える関数です。
ポインタを使わない場合、入れ替わるのは関数のなかだけで呼び出し側の変数は変わらないため、ポインタを使っていました。
これを参照を使って書くと以下のようになります。
reff_sample5.cpp
void MySwap(int &x, int &y) { int buf = x; x = y; y = buf; }
*が無くなって読み易くなりましたね。
動作自体は変わりません。
このように、ソースコードがわかり易くなることでコーディングのミスを減らすことができます。
値を変更しない参照引数
上記の例では引数に指定した参照の参照元の値を変更するものでした。
しかし、呼び出し元の値を変更してはいけない場合もあります。
まさに「参照」するだけの場合ですね。
全て自分で書いたコードであれば間違うこともないかもしれませんが、複数人でコーディングしている場合など、想定していない用途で使われてしまう場合があります。
上記の例でもそうですが、関数内で呼び出し元の値を変更します。
変更しようと思ってする場合は問題ありませんが、誤って変更してしまうのはこまりますね。
そこで値を変更せずに済ませる方法があります。
詳細はconstとポインタを参照してください。