参照の最も頻繁な使用は、コストのかかるディープ コピーを回避することです。デフォルトでは、C++ には値のセマンティクスがあり、次のように記述した場合:
void f( std::vector<double> d );
を呼び出すたびに、ベクトル全体がコピーされますf
。したがって、次のように記述します。
void f( std::vector<double> const& d );
これが特に重要な場所の 1 つは、コピー コンストラクターを定義するときです。あなたが書くなら:
MyType( MyType other );
、コンパイラは引数をこのコンストラクターにコピーするためにコピーコンストラクターを呼び出す必要があるため、無限再帰になります。(実際、コンパイラは、正確にこの問題を回避するために、コピー コンストラクタへの参照を取るコンストラクタのみを受け入れます。)
コンストラクター以外では、これは実際には最適化であり、時期尚早の最適化と見なすことができます。ただし、実際には、値ではなく const への参照によってクラス型を渡すことが、ほぼ普遍的な規則です。
参照は出力パラメータとしても使用できます。ポインターと比較して、null にできないという利点があります。
参照は、クラス データへの「ウィンドウ」を提供するためにも使用できます。古典的な例は、 in のオーバーロードoperator[]
ですstd::vector
。配列内の実際の要素を変更したり、アドレスを取得したりできるように、参照を返します。
上記の場合、パラメータや戻り値以外で参照することはやや稀です。たとえば、クラス メンバーとして 1 つを使用する場合、クラスに従来の代入セマンティクスを与えることはできないことに注意する必要があります。(クラスが代入をサポートしていない場合、これは問題になりません。) グローバル変数として、参照されているものの実装を隠すために使用される場合がありますが、これは非常にまれです。ローカル変数として、私が知っている唯一の用途は、参照を返す別の式の結果をキャッシュすることです。たとえば、someMap[aKey]
短いコード ブロックで何度もアクセスしている場合、 :
ValueType& element = someMap[aKey];
最初に、element
その後に使用します。someMap[aKey]
(参照を返すため、これは意味があることに注意してください。)