Author:ys2310
2008年春にNew York Cityにあるふる〜い大学を卒業。
リファレンスとは何かということを解説するために、まず、最も簡単な例をあげましょう。次のコードを見てください。int 型の変数 iABitComplex のリファレンス riSimple を定義しています。
int main() {
int iABitComplex; // ちょっと複雑な名前の変数
int& riSimple = iABitComplex; // 変数のリファレンスを定義する。
riSimple = 1; // リファレンスを使って iABitComplex にアクセスする。
return 0;
}
少し解説する必要はありますが、これが、リファレンスの全てといっていいでしょう。ポインタはでてきていませんね。では、早速解説を。
まず、int 型の変数のリファレンスは、形式的には int& 型となります。つまり、変数型として int に & をつけて、int& とするわけです。この & が、変数のアドレスを取るための演算子 & と誤解されやすく、リファレンスとは何かポインタに関連するのではないかと思い込んでしまう人のパーセンテージががかなり高いのですが、それは全く間違いです。
では、上記の「変数のリファレンスを定義する。」と書かれた行の正しい意味はどのようなものかというと、iABitComplex というちょっと複雑な名前の int 型の変数を、もう少し簡単な riSimple と言う別の名前でも扱えるようにする、ということになります。つまり、変数に別の名前を付けたわけです。一旦、別名をつけると、その別名、つまりリファレ ンスをコード中に記述することは、元の変数の名前を記述することとまったく同じ意味になります。例外的に、const をつけた参照では、元の変数に書き込むことができないという制約はありますが、リファレンスを扱うことによって、元の変数を扱うことになる、ということに は変りありません。
上記のようなメカニズムなので、別名であるリファレンスを定義するときには、その別名の元となる変数が必ず必要です。つまり、元の変数あってこそのリファレンスなわけです。変数型と して int& を使うと上に書きましたが、リファレンスは、それ自体は変数というよりも、ただの名前なので、コンピュータ上にリファレンスのためのメモリ領域は基本的に は無いと考えた方が良いでしょう。ですから、リファレンス自体を変数として読んだり、書いたりすることはできません。そのようにしようとすると、元の変数 を読んだり書いたりすることになるというわけです。
配列のリファレンスは、記述の仕方が少し複雑なので、ここで、例を示しておきます。次の例を見てください。
int main() {
int aiArray[3]; // int[3] 型の配列
int (&raiArray)[3] = aiArray; // int[3] 型の配列の参照、raiArray
return 0;
}
int と & の位置に注目してください。ただ、これだけのことですが、知らないと窮するかもしれませんね。