デフォルトのコピー コンストラクターは、宣言されたコピー コンストラクターのないオブジェクトを持つクラスをどのように処理しますか?

Barbara Streisand
リリース: 2024-11-12 12:15:02
オリジナル
523 人が閲覧しました

How Does the Default Copy Constructor Handle Classes with Objects Lacking Declared Copy Constructors?

他のオブジェクトを含むクラスのデフォルトのコピー コンストラクター

C でクラスを宣言する場合、明示的な実装が提供されていない場合、コンパイラーは自動的にデフォルトのコピー コンストラクターを提供することがあります。ただし、宣言されたコピー コンストラクターを持たないオブジェクトを含むクラスを扱う場合、このコンストラクターの動作はより複雑になります。

次のコードを考えてみましょう。

class Foo {
  Bar bar;
};

class Bar {
  int i;
  Baz baz;
};

class Baz {
  int j;
};

Foo f1;
Foo f2(f1);
ログイン後にコピー

次のような疑問が生じます。このシナリオでは、デフォルトのコピー コンストラクターが動作しますか?

コンパイラーで生成されたコピー コンストラクターの動作

Foo のコンパイラーで生成されたコピー コンストラクターは次のように動作します:

  1. 基本クラス (存在する場合) のコピー コンストラクターを呼び出します。
  2. Foo の各メンバー変数をコピーします。これには、Bar のコピー コンストラクターの呼び出しが含まれます。
  3. Bar のコピー コンストラクターは、Baz のコピー コンストラクターを呼び出します。

したがって、提供された例では、f1 を使用して f2 を構築するときに、

  1. f2 の Foo のコピー コンストラクターを呼び出します。
  2. Foo のコピー コンストラクターは、bar のコピー コンストラクターを呼び出します。
  3. コピーbar のコンストラクターは、baz のコピー コンストラクターを呼び出します。

Baz には宣言されたコピー コンストラクターがないため、コンパイラーはデフォルトのコピー コンストラクターを生成します。このデフォルトのコピー コンストラクターは浅いコピーを実行し、j の値をコピーしますが、それが指すオブジェクトはコピーしません。

浅いコピーと深いコピー

この浅いコピーの動作は次のことを意味することに注意することが重要です。 Foo のメンバー変数が指すオブジェクトはコピーされません。元のオブジェクトが後から変更された場合、変更された値はコピーされたオブジェクトに反映されないため、これにより意図しない結果が生じる可能性があります。

コピー プロセスをより詳細に制御するには、コピー コンストラクターを明示的に定義することをお勧めします。メンバー変数の制御されたコピーが必要なクラス。

以上がデフォルトのコピー コンストラクターは、宣言されたコピー コンストラクターのないオブジェクトを持つクラスをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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