参照メンバー変数で最初に考慮すべきことは、クラス(ではなくDerived
、ポインターまたは参照であるデータメンバーを持つクラスBase
)が値のセマンティクスを必要とするかどうかです(これは、「適切にコピーして割り当てる」という別の言い方です。 ")。
もしそうなら、参照メンバー変数は、再装着できないため、多かれ少なかれすぐに問題から外れます。とにかくそれらを使用できるいくつかの奇妙な状況がありますが、使用しないと想定して、ポインターを使用することもできます。
参照データメンバーは、「エンティティセマンティクス」を持つタイプ(つまり、まったく割り当てられず、コピーされる場合とされない場合があります)に役立つ場合がありますが、それでも大きなメリットはありません。const Base&
また、パラメーターを受け取るコンストラクターを作成し、それを参照データメンバー[*]に格納するというエラーにあなたを誘惑する可能性もあります。
オブジェクトの所有者(およびオブジェクトの解放の責任者)は、ポインターと参照のどちらを使用するかとは完全に無関係です。おそらく、所有するものに参照を使用しないという一般的な規則があります(また、所有するものにrawポインターを使用しないという規則があるはずです。適切なスマート・ポインターを選択または作成する必要があります。スマート・ポインター・クラスはrawポインターを保持できます)。しかし、それは単なる慣習です。ポインタがある場合にのみ、メモリを管理していると思い込まないでください。
概要:ポインタを使用してから、メモリの管理方法を個別に決定します。
[*]これは間違いです。最終的に誰かが初期化子で一時オブジェクトを誤って使用し、その参照データメンバーを持つクラスのインスタンスが一時オブジェクトよりも長持ちするためです。このため、const &
オブジェクトを変更しなくても、戻った後に使用するために参照を格納するものは、パラメーターを受け取らないようにする必要があります。彼らはconst *
代わりに取ることができます。C ++ 11では、一時的なオーバーロードが選択されるのを防ぐために、右辺値参照オーバーロードもあれば問題ないと思いますが、const&
まだ試したことはありません。