2

クラスがあります。

class Books
{
private:
    int m_books;
public:
    Books(int books=0)
    {
        m_books = books;
    }

    Books(const Books &source)  //Here is what I don't understand.
    {
        m_books = source.m_books;
    }
};

なぜそれが である必要があるのか​​ 理解できませBooks(const Books &source)Books(const Books source)

4

7 に答える 7

9

あなたが持っているとき

Books(const Books &source)

ソースは参照によって渡されます。あなたが持っているとき

Books(const Books source)

値渡しされていたはずです。しかし、値渡しするには、コピー コンストラクターになります。したがって、無限再帰を避けるために、コピー コンストラクターは参照を受け入れる必要があります。

于 2012-12-07T17:22:32.993 に答える
8
Books(const Books &source)

int(またはなどのプリミティブの場合のように、値渡しのように)実際の変数の代わりに参照が渡されることを意味しますchar

この場合、コピーコンストラクターを構築しているため、参照が渡されるオブジェクトに変更を加えたくないため、引数の署名の前にプレフィックスが付けられますconst(これにより、渡される引数が不変であることが保証されます)

注意、最も重要なこと:ここでの値渡しは無限再帰を導入します-@AProgrammerの回答を参照してください)それとは別に、source値渡し(つまり、コピー時にソース全体のコピーを作成する)も不必要にコストがかかりますコンストラクターが呼び出されます)、代わりに参照を使用します。


あなたが興味を持っているかもしれない追加の読み物:C++の参照渡しと値

于 2012-12-07T17:18:06.450 に答える
3

あなたが見ているのは、コピーコンストラクターと呼ばれるものです。オブジェクトを参照で渡す必要がある理由は、値で渡す場合、オブジェクトのコピーを作成する必要があるため、コピー コンストラクターを再度呼び出す必要があるためです。そしてまた。そしてまた ...

于 2012-12-07T17:20:50.483 に答える
1

したがって、本は値でコピーされるのではなく、参照によって渡されます。

于 2012-12-07T17:17:49.953 に答える
1

参照を使用するということは、コピーが含まれないことを意味します。あなたが持っていた場合:

Books(const Books source)

次に、呼び出し元が渡す引数をにコピーする必要がありますsource。代わりに参照を使用すると、コピーは作成されません。これにより、パフォーマンスが向上します。少量のデータでは、大量のデータがない単純なクラスであるため、それほど重要ではありません。しかし、より複雑なクラスでは、コピーにコストがかかる可能性があります。参照を使用すると、その問題を回避できます。

ただし、コピーコンストラクターの場合、コピーを回避することが重要です。パフォーマンス上の理由ではなく、コピーにはコピーコンストラクターが含まれるという事実によるものです。コピーコンストラクターが呼び出されたときに、参照が使用されなかった場合は、別のコピーを作成する必要があります。これは、コピーコンストラクターへの別の呼び出しを意味します。そこで、さらに別のコピーを作成する必要があります。コピーコンストラクターへのさらに別の呼び出し。

ご想像のとおり、これにより、コピーコンストラクターの呼び出しが無限に発生します。参照を使用することにより、この状況は回避されます。

于 2012-12-07T17:18:54.103 に答える
0

コピーコンストラクターについて読む:http ://www.cplusplus.com/articles/y8hv0pDG/

于 2012-12-07T17:18:43.283 に答える
0

オブジェクトへの参照を渡しBooks sourceます。それがすべてです。

これがお役に立てば幸いです。

于 2012-12-07T17:18:45.677 に答える