参照
変数の別名
参照とは、変数のアドレスを指す識別子のことです
この点で、非常にポインタと酷似しているためややこしく考えてしまう人もいるでしょう
わかりやすく言うなれば、参照は変数の別名的存在です
ポインタは、物理的なメモリアドレスを指す独立した変数ですが
参照は、必ず何らかの変数を指しています
参照を宣言するには、宣言時に変数の前に アンパサンド 「 & 」 を指定します
変数のアドレスを出力する & 演算子とは異なるので注意してください
type &ref = var;
type には変数の型を、ref は参照の名前を指定します
この場合は、変数 var を参照 ref として設定します
参照はポインタと異なり、名前が違うだけで変数そのものを表します
上の場合、参照 ref は変数 var と同一のものと考えることができます
さらに、参照は独自のアドレスを持たず、変数のアドレスそのものを指します
次のプログラムを実行すれば、ポインタと参照の違いがわかるでしょう
#include <iostream>
using namespace std;
int main() {
int i = 100;
int &ref = i;
ref++;
cout << i << " : " << ref << '\n';
cout << &i << " : " << &ref;
return 0;
}
例えば、次のような結果になります
101 : 101
0065FE00 : 0065FE00
下のメモリアドレスは実行時で異なりますが、双方とも同じ値になったはずです
変数 i と、参照 ref のアドレスはまったく同じものです
参照のアドレスと言うものは存在せず、変数の論理的複製です
そのため、参照の値を更新することは変数の値を更新することに等しいと言えます
参照はこのような仕様のため、必ず宣言時に初期化します
それと、参照の配列は作れないと言うのも特徴です
一般的には、同じローカル域で上のプログラムのような使われ方はしません
通常は関数間のオブジェクトの受け渡しなどで使用されます
上のような、変数の別名としての使われ方は極めてまれと言えます
変数の別名として参照を用いる方法を独立参照と呼びます
もちろん、オブジェクトの参照を作成することも可能です
また、const 指定した参照を宣言して、定数と使うこともできます
#include <iostream>
using namespace std;
class Kitty {
public:
char *str;
} obj;
int main() {
Kitty &ref = obj;
ref.str = "Kitty on your lap";
cout << obj.str;
return 0;
}
オブジェクトの参照も、通常の変数の参照と同じです
type & ref
オブジェクトの参照を宣言します
参照はオブジェクトのアドレスを格納しますが、構文的にはオブジェクトそのものと同じです
type - 参照するオブジェクトの型を指定します
ref - 参照の名前を指定します