148

これは、質問を説明するための単純化された例です。

class A {};

class B
{
    B(A& a) : a(a) {}
    A& a;
};

class C
{
    C() : b(a) {} 
    A a;
    B b; 
};

したがって、B は C の一部を更新する責任があります。コードを lint で実行したところ、参照メンバーlint#1725についてぐずりました。これは、デフォルトのコピーと割り当てに注意することについて話していますが、これは十分に公平ですが、デフォルトのコピーと割り当てはポインターでも悪いため、そこにはほとんど利点がありません。

ネイキッド ポインターを使用すると、そのポインターを削除する責任が誰にあるのかについて不確実性が生じるため、私は常にできる限り参照を使用するようにしています。私はオブジェクトを値で埋め込むことを好みますが、ポインターが必要な場合は、ポインターを所有するクラスのメンバー データで auto_ptr を使用し、オブジェクトを参照として渡します。

通常、ポインターが null になるか、変更される可能性がある場合にのみ、メンバー データでポインターを使用します。データ メンバーの参照よりもポインターを優先する他の理由はありますか?

一度初期化された参照は変更されるべきではないため、参照を含むオブジェクトは割り当て可能であってはならないというのは本当ですか?

4

10 に答える 10

74

クラスの実装ができることを制限し(言及したように、代入演算子の実装を妨げることを含む)、クラスが提供できるものに何の利益ももたらさないため、参照メンバーは避けてください。

問題の例:

  • 各コンストラクターの初期化子リストで参照を初期化する必要があります: この初期化を別の関数に分解する方法はありません ( C++0x まで、とにかく 編集: C++ には委任コンストラクターがあります)
  • 参照を再バインドしたり、null にすることはできません。これは利点になる可能性がありますが、再バインドを許可するため、またはメンバーを null にするためにコードを変更する必要がある場合は、メンバーのすべての使用を変更する必要があります。
  • ポインター メンバーとは異なり、リファクタリングで必要になる可能性があるため、参照をスマート ポインターやイテレーターに簡単に置き換えることはできません。
  • 参照が使用されるときはいつでも、値型 (演算子など) のように見えます.が、ポインターのように動作します (ぶら下がる可能性があります)。たとえば、Google スタイル ガイドでは推奨されていません。
于 2009-05-21T10:41:37.397 に答える
5

誰もが一般的なルールを配っているように見えるので、私は2つ提供します:

  • クラスメンバーとして参照を使用することは絶対にしないでください。私は自分のコードでそうしたことをしたことがなく (このルールで自分が正しいことを自分自身に証明する場合を除いて)、そうするケースを想像することもできません。セマンティクスは混乱しすぎており、参照が設計された目的とはまったく異なります。

  • 基本的な型を除いて、またはアルゴリズムがコピーを必要とする場合を除いて、関数にパラメーターを渡すときは常に、常に参照を使用してください。

これらのルールは単純であり、私をうまく支えてきました。スマート ポインター (ただし、auto_ptr は使用しないでください) をクラス メンバーとして使用する際の規則の作成は、他のユーザーに任せます。

于 2009-05-21T11:08:42.647 に答える
4

はい:参照を含むオブジェクトは代入可能であってはならないというのは本当ですか?

データ メンバーに関する私の経験則:

  • 割り当てを妨げるため、参照を使用しないでください
  • クラスが削除を担当する場合は、boost の scoped_ptr を使用します (auto_ptr よりも安全です)。
  • それ以外の場合は、ポインターまたは const ポインターを使用します
于 2009-05-21T09:47:24.153 に答える
2

通常、ポインターが null になるか、変更される可能性がある場合にのみ、メンバー データでポインターを使用します。データ メンバーの参照よりもポインターを優先する他の理由はありますか?

はい。コードの可読性。ポインターを使用すると、メンバーが参照であり (皮肉なことに:))、含まれているオブジェクトではないことがより明確になります。これは、使用するときに参照解除する必要があるためです。時代遅れだと思う人もいると思いますが、混乱や間違いを防ぐだけだと私は思います.

于 2009-05-21T10:19:07.583 に答える