プログラミングにおける深いコピーと浅いコピー
浅いコピーには、元のデータと同じ基礎となるデータを参照する新しいオブジェクトの作成が含まれます。対照的に、深いコピーでは、元のオブジェクトに関連付けられたすべてのデータの独立した複製を含む新しいオブジェクトが構築されます。
次の C クラスを考えてみましょう:
<code class="c++">class X { public: int i; int *pi; X() : pi(new int) {} X(const X& copy) : i(copy.i), pi(copy.pi) {} };</code>
この場合、浅いコピーが行われます。元の X オブジェクトとコピーされた X オブジェクトの両方で、pi を割り当てるときに同じ int オブジェクトを指します:
<code class="c++">X original; X copy(original);</code>
一方、ディープ コピーには、新しい int オブジェクトが割り当てられるコピー コンストラクターのステップが含まれます:
<code class="c++">class X { public: int i; int *pi; X() : pi(new int) {} X(const X& copy) : i(copy.i), pi(new int(*copy.pi)) {} };</code>
結果として、コピーされた X オブジェクトは、元のオブジェクトと同じ値を持つ独自の int オブジェクトを持つことになります。
当初、デフォルトのコピー コンストラクターは常に浅いコピーを実行すると考えられていました。ただし、その挙動は各メンバーのタイプに依存することが明らかになりました。標準ではメンバー単位のコピーが指定されています。これは、スカラー型 (この例では int など) が組み込みの代入演算子を使用してコピーされることを意味します。
したがって、深いコピーと浅いコピーの選択は、アプリケーションの特定の要件によって異なります。およびコピーされるデータの特性。
以上が深いコピーと浅いコピー: いつどちらを選択すべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。