StroustrupがC++への参照を導入する理由は、演算子のオーバーロードです。
http://www.stroustrup.com/bs_faq2.html#pointers-and-references
サンプル関数では、ユーザーが(ポインターを受け取るため)bar
として呼び出す必要があるか、(参照を受け取るため)で呼び出すことができるかは大した問題ではありません。少なくとも、Cプログラマーはそうではないと考えています。bar(&x)
bar(x)
ただし、演算子のオーバーロードがC ++に追加されたとき、Stroustrupは、オーバーロードされた演算子をポインターで使用することは非常にエレガントではないと考えました(彼の言葉では「醜い」)。
参照には、一時オブジェクトをconst参照にバインドできるなど、ポインターよりも機能的にいくつかの利点がありますが、&
演算子を適用することはできません。そのため、pass-by-const-reference関数は、pass-by-pointer-to-constの同等の関数と比較して、呼び出し元に(変数を作成するための)コード行を節約することがあります。
このため、可能な規則の1つは、関数がアドレスを格納した後、将来使用するためにアドレスをどこかに格納する場合はポインターを受け入れ、そうでない場合は参照を受け入れることです。ダングリングポインタ/参照を作成するためのすべての可能な方法を妨げるわけではありませんが、大きなものをキャッチします。ただし、機能スタイルのコードを作成する場合は不幸な結果を招くため、すべての人に適しているわけではありません。
また、2番目の方法を使用する場合は、ではなく->を使用する必要があることに気付きました。構造体を渡すと...なぜですか?
.
構造体のメンバーにアクセスするため、構造体->
へのポインターを介してメンバーにアクセスするために、Cから継承された構文にすぎません。Cでは、LHSのポインターでのみ使用でき、LHSのポインターで使用->
することはできません.
。したがって、異なる記号は厳密には必要ありません。コードを読みやすくしてリマインダーを付けるのに役立ちます。たとえば、.
両方に同じ記号が使用されている場合、(*ptr).member
はと同じことを意味し、ptr.member
おそらく混乱を招きます。
C ++では、この違いが言語にとって有用になります。クラスタイプに対してオーバーロードできoperator->
ます。たとえば、スマートポインタはオーバーロードします。ただし、クラスタイプには、でアクセスできるメンバーを含めることができます.
。つまり、「スマートポインターの参照で関数をsome_smart_ptr->get();
呼び出す」を意味し、「スマートポインターで関数を呼び出す」を意味します。get()
some_smart_ptr.get()
get()