ホームページ > バックエンド開発 > C++ > ディープ コピーとシャロー コピー: データの真のコピーが必要になるのはどのような場合ですか?

ディープ コピーとシャロー コピー: データの真のコピーが必要になるのはどのような場合ですか?

Barbara Streisand
リリース: 2024-10-27 11:01:30
オリジナル
945 人が閲覧しました

 Deep Copy vs. Shallow Copy: When Do I Need a True Copy of My Data?

深いコピーと浅いコピー

質問:

両者の主な違いは何ですか?深いコピーと浅いコピー?

答え:

浅いコピー:

  • オブジェクトの値をコピーしますが、保持されます。共有オブジェクトへの参照。
  • 例:

    <code class="c++">class X {
    private:
      int i;
      int *pi;
    public:
      X() : pi(new int) {}
      X(const X& copy) : i(copy.i), pi(copy.pi) {}
    };</code>
    ログイン後にコピー

    この浅いコピーでは、pi は元のオブジェクトとコピーされたオブジェクトの両方で同じ int オブジェクトを参照します。

ディープ コピー:

  • すべての埋め込みオブジェクトを含む、元のオブジェクトの完全なコピーを作成します。
  • 例:

    <code class="c++">class X {
    private:
      int i;
      int *pi;
    public:
      X() : pi(new int) {}
      X(const X& copy) : i(copy.i), pi(new int(*copy.pi)) {}
    };</code>
    ログイン後にコピー

    このディープ コピーでは、pi は元の値と同じ値を持つ新しい int オブジェクトを指します。

コピー コンストラクターの種類:

デフォルトのコピー コンストラクターは、各メンバーのコピー コンストラクターの動作によって異なります。

  • スカラー型の場合、デフォルトの代入演算子が使用され、浅いコピーが生成されます。
  • ただし、デフォルトのコピー コンストラクターが常に浅いコピーを実行するというのは厳密には正しくありません。メンバータイプのコピー動作に応じて、深いコピー、または深いコピーと浅いコピーの組み合わせを実装できます。

例:

In次の例では、デフォルトのコピー コンストラクターは、その実装により std::vector メンバーのディープ コピーを作成します。

<code class="c++">class Y {
private:
    std::vector<int> v;
public:
    Y() {}
    Y(const Y& copy) : v(copy.v) {}
};</code>
ログイン後にコピー

この場合、std::vector のコピー コンストラクターは、そのメンバーのディープ コピーを作成します。内容。

以上がディープ コピーとシャロー コピー: データの真のコピーが必要になるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート