3

C++ での参照メンバーの使用例を 1 つも理解できないことに気付きました。次のクラスを定義するとします。

class Book {
   public:
       Book(const Author& author) : author(author) {}
   private:
       const Author &author;
}

どうすればそれを使用できますか?newedを渡すAuthorと:

Book book(*(new Author()));

メモリリークしませんか?はいつAuthor発売されますか?

もう一度試してみましょう。それにローカル変数を渡すのはどうですか:

Book macBook() {
    Author author();
    return Book(author);
}

返された Book に無効な (解放された) 参照がありませんか?

3番目の使用方法が想像できません。では、なぜ参照メンバーが存在するのでしょうか。いつ使用すればよいですか?

編集:私はあることを知っていますshare_ptr。しかし、私は常に参照することを好むべきshare_ptrですか?

4

3 に答える 3

1

値によるオブジェクトのコピーが高価な場合、参照は一般的に役立ちます。オブジェクトを引数として関数に渡し、それをコピーするとコストがかかる場合は、参照を使用する必要があります。当然、関数によってオブジェクトを変更可能にするつもりがない場合は、実際には定数参照を使用します。

void someFunc(const BigObject& object)
{
    /* 'object' is used here */
}

クラスコンストラクターは「単なる別の関数」であるため、ここで同じパターンを使用できます。あるクラスインスタンスにコピーするのにコストがかかるオブジェクトを、その存続期間中に使用するために提供したい場合は、const- を定義することが重要です。クラスコンストラクターで提供されたオブジェクトにバインドされる、そのクラスの ref メンバー:

class Worker
{
public:
    Worker(const BigObject& object) : m_object(object) { /* ... */ }
    // ...
private:
    const BigObject& m_object;
}

BigObject object;
Worker worker(object);

当然のことながら、ここで留意すべき最も重要なことは、BigObjectオブジェクトが存在している間にオブジェクトが破壊されないようWorkerにすることです。(上記の例では、両方の変数が自動であるため、これで問題ありません。)

確かに、参照の代わりにポインターを使用して同じ効果を得ることができますが、ポインターでは、ポインターが (意図的または偶然に) ゼロの場合を常に考える必要があり、&演算子を渡す際に明示的に演算子を使用する必要があります。オブジェクトなので、リファレンス バージョンはコードを単純にするだけです。

于 2013-10-25T11:46:44.973 に答える