ホームページ > バックエンド開発 > C++ > ユーザー定義のコピー コンストラクターを C で実装する必要があるのはどのような場合ですか?

ユーザー定義のコピー コンストラクターを C で実装する必要があるのはどのような場合ですか?

Mary-Kate Olsen
リリース: 2024-10-23 17:49:49
オリジナル
1103 人が閲覧しました

When Should You Implement a User-Defined Copy Constructor in C  ?

ユーザー定義のコピー コンストラクターはどのような場合に必要ですか?

C コンパイラーは、メンバーごとに実行されるクラスのコピー コンストラクターを自動的に生成します。デフォルトでコピーします。ただし、特定の状況では、独自のユーザー定義のコピー コンストラクターを定義する必要がある場合があります。

ユーザー定義のコピー コンストラクターを定義する理由:

  • ディープコピー: クラスのメンバー変数が、個別にコピーする必要がある動的メモリを割り当てる場合、メンバーごとのコピーでは不十分です。このような場合、ディープ コピーを実行するにはユーザー定義のコピー コンストラクターが必要です。これにより、オブジェクトのメンバー変数の動的メモリの新しいコピーが作成されます。

例:

文字列を格納する次のクラスについて考えてみましょう。

1

2

3

4

5

6

7

<code class="cpp">class Class {

public:

    Class(const char* str);

    ~Class();

private:

    char* stored;

};</code>

ログイン後にコピー

デフォルトのコピー コンストラクターでは、格納されたメンバーは参照によってのみコピーされるため、コピーの 1 つがコピーされたときに未定義の動作が発生します。破壊されました。これを防ぐために、ディープ コピーを実行するユーザー定義のコピー コンストラクターを定義します:

1

2

3

4

<code class="cpp">Class::Class(const Class& another) {

    stored = new char[strlen(another.stored) + 1];

    strcpy(stored, another.stored);

}</code>

ログイン後にコピー

さらに、代入演算子がディープ コピーを正しく実行するには、ユーザー定義のコピー コンストラクターも必要です:

1

2

3

4

5

6

<code class="cpp">void Class::operator = (const Class& another) {

    char* temp = new char[strlen(another.stored) + 1];

    strcpy(temp, another.stored);

    delete[] stored;

    stored = temp;

}</code>

ログイン後にコピー

以上がユーザー定義のコピー コンストラクターを C で実装する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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