9

私はC++を学んでいて、からコピーコンストラクターを読んでいましたC++: The Complete Reference。本はそう言っている

コピー コンストラクターは、既定の引数が定義されている限り、追加のパラメーターを持つことができます。ただし、すべての場合において、最初のパラメーターは、初期化を行うオブジェクトへの参照である必要があります。

しかし、これらの追加のパラメーターをどのように渡すのか混乱していますか? 本に書かれておらず、私が理解できない方法があるはずです。誰でも私を助けることができますか?

編集: これらの追加のパラメーターを3つのケースすべてで渡すことも可能ですか?

  • 宣言などで、あるオブジェクトが別のオブジェクトを明示的に初期化するとき
  • オブジェクトのコピーを作成して関数に渡す場合
  • 一時オブジェクトが生成されるとき (最も一般的には、戻り値として)
4

2 に答える 2

13

簡単な例を次に示します。

class A {
    //...
public:
    A (const A&, bool deep = false) {
        if (!deep) { /* make a shallow copy */ }
        else { /* make a deep copy */ }
    }
};

void foo (A x) { /*...*/ }
A bar () { /*...*/ return A(); }
A a_var;

この例では、パラメーターはデフォルトで false に設定されています。これは、デフォルトのコピー コンストラクターが浅いことを意味します。

A b(a_var);       // b gets a shallow copy of a
foo(b);           // foo() receives a shallow copy

ただし、2 番目のパラメーターに true を渡すことで、ディープ コピーを行うことができます。

A b(a_var, true); // b gets a deep copy of a
foo(A(b, true));  // foo receives a shallow copy of a deep copy

同様に、 を返す関数Aの場合、デフォルトを使用しているため、返されるコピーは浅いものになりますが、受信者はそれを受け取るときにそれを深くすることができます。

A b(bar());       // shallow
A b(bar(), true); // deep

コピー コンストラクターを定義するときは、デストラクタを定義し、代入演算子をオーバーロードする必要があることを意味する可能性が高いことを覚えておいてください (3 つのルール)。

于 2012-06-08T05:30:39.403 に答える
1

このように考えてください: コンストラクターの概念しかありません。コンパイラは、コピーを作成する必要があると判断すると、 type の単一のオブジェクトを渡すことによって呼び出すことができるコンストラクターを探しますT。この特殊な使用例のため、慣習的に、選択されたコンストラクターを「コピー」コンストラクターと呼びます。

于 2012-06-08T05:43:59.050 に答える