C でクラスを宣言する場合、明示的な実装が提供されていない場合、コンパイラーは自動的にデフォルトのコピー コンストラクターを提供することがあります。ただし、宣言されたコピー コンストラクターを持たないオブジェクトを含むクラスを扱う場合、このコンストラクターの動作はより複雑になります。
次のコードを考えてみましょう。
class Foo { Bar bar; }; class Bar { int i; Baz baz; }; class Baz { int j; }; Foo f1; Foo f2(f1);
次のような疑問が生じます。このシナリオでは、デフォルトのコピー コンストラクターが動作しますか?
Foo のコンパイラーで生成されたコピー コンストラクターは次のように動作します:
したがって、提供された例では、f1 を使用して f2 を構築するときに、
Baz には宣言されたコピー コンストラクターがないため、コンパイラーはデフォルトのコピー コンストラクターを生成します。このデフォルトのコピー コンストラクターは浅いコピーを実行し、j の値をコピーしますが、それが指すオブジェクトはコピーしません。
この浅いコピーの動作は次のことを意味することに注意することが重要です。 Foo のメンバー変数が指すオブジェクトはコピーされません。元のオブジェクトが後から変更された場合、変更された値はコピーされたオブジェクトに反映されないため、これにより意図しない結果が生じる可能性があります。
コピー プロセスをより詳細に制御するには、コピー コンストラクターを明示的に定義することをお勧めします。メンバー変数の制御されたコピーが必要なクラス。
以上がデフォルトのコピー コンストラクターは、宣言されたコピー コンストラクターのないオブジェクトを持つクラスをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。