ネストされたオブジェクトを持つクラスのコンパイラ生成のコピー コンストラクター
クラスに他のオブジェクトが含まれており、コピー コンストラクターを明示的に定義していない場合、コンパイラはデフォルトのコピー コンストラクターを提供します。このコンストラクターは、ネストされたオブジェクトに対して浅いコピーを実行します。つまり、新しいインスタンスを作成するのではなく、それらのオブジェクトへの参照をコピーします。
例:
次のクラス階層を考えてみましょう。
class Foo { Bar bar; }; class Bar { int i; Baz baz; }; class Baz { int j; };
ステートメント Foo f2(f1) が実行されると、次のコピー コンストラクターのシーケンスは次のようになります。呼び出し:
コンパイラー生成のコピー コンストラクターの動作:
一般に、コンパイラによって生成されたコピー コンストラクターは、ネストされたオブジェクトのコピーを作成しますby:
影響:
動作入れ子になったオブジェクトに特定のコピー セマンティクスがある場合、入れ子になったオブジェクトに対してコンパイラが生成したコピー コンストラクターが原因で予期しない結果が生じる可能性があります。たとえば、Bar にメモリ割り当てを実行する深いコピー コンストラクタがある場合、Foo のデフォルトのコピー コンストラクタは Bar を浅いコピーのみにし、メモリ リークやデータ破損を引き起こす可能性があります。
これらの問題を回避するには、次のようにします。一般に、特にそれらのオブジェクトが複雑なコピー セマンティクスを持つ場合、他のオブジェクトを含むクラスに対してコピー コンストラクターを明示的に定義することをお勧めします。
以上がネストされたオブジェクトを持つクラスに対してコンパイラで生成されたコピー コンストラクターを使用すると、どのような影響がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。