【C++】独立参照(independent reference)

※ここではいわゆる独立参照(independent reference)を扱う。関数への参照仮引数などは扱わない。

基本概念

wikipediaの説明

C++における参照は、ポインタと同様「変数がメモリ上に置かれている場所」と解される場合もあるが、それよりもむしろ「その変数を参照する(=変数の値を操作したり出来る)権限」と解されることが多い。参照の概念そのものはメモリの概念と切り離して考えることが可能である(実装上はポインタと同じであることも多い)。

C++における参照の例

int n = 5;
int& ref = n; // refをnへの参照で初期化する
ref = 1;

この場合変数refはnを参照している。refとnはオブジェクトを共有しているのでrefと呼んでもnと呼んでも同じものを表す。すなわち変数nにエイリアス(別名)refが付いたことになる。

この説明にもあるように、参照とはポインタの一種ではない。
参照とは、上の例で言うと、nをrefという名前でも扱えるようにするということである。
すべての面で変数の別名として動作するもの。
refに対する操作は、すべてnに対してしたことと同義となる。

ポインタとの違い

操作方法は下記3点で異なる。

  • 参照の設定は初期化の時だけである。ポインタはいつでもアドレス設定ができる。
  • 参照とエイリアス対象の変数との結合はプログラムが終了するまで解かれることはない。ポインタはいつでも設定変更できる
  • ポインタは自身を変更できるが、参照は自身を変更する演算子はない。

(参考)
C++ Independent references - what for? - Stack Overflow