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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-23 17:49:49959ブラウズ

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

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

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

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

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

例:

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

<code class="cpp">class Class {
public:
    Class(const char* str);
    ~Class();
private:
    char* stored;
};</code>

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

<code class="cpp">Class::Class(const Class& another) {
    stored = new char[strlen(another.stored) + 1];
    strcpy(stored, another.stored);
}</code>

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

<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 までご連絡ください。