「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ でユーザー定義のコピー コンストラクターが不可欠になるのはどのような場合ですか?

C++ でユーザー定義のコピー コンストラクターが不可欠になるのはどのような場合ですか?

2024 年 11 月 6 日に公開
ブラウズ:645

When Is a User-Defined Copy Constructor Essential in C  ?

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

コピー コンストラクターは C オブジェクト指向プログラミングに不可欠であり、既存のインスタンスに基づいてオブジェクトを初期化する手段を提供します。通常、コンパイラはクラスのデフォルトのコピー コンストラクターを生成しますが、カスタマイズが必要なシナリオもあります。

ユーザー定義のコピー コンストラクターが必要なシナリオ

デフォルトのコピー コンストラクターが不十分な場合、プログラマはカスタムのコピー動作を実現するためのユーザー定義のコピー コンストラクター。これは、デフォルトのコピー コンストラクターによって実行されるメンバーごとのコピーが必要な要件を満たせない状況では特に重要です。

例 1: 動的に割り当てられたデータのディープ コピー

次のコードに示すように、動的に割り当てられたメンバー変数を持つクラスを考えます。

class Class {
public:
    Class(const char* str);
    ~Class();

private:
    char* stored;
};

Class::Class(const char* str) {
    stored = new char[strlen(str)   1];
    strcpy(stored, str);
}

Class::~Class() {
    delete[] stored;
}

この例では、格納されたメンバーのメンバーごとのコピーはポインターのみを複製し、実際の文字バッファーは複製しません。その結果、コピーの 1 つが破棄されると、もう 1 つのコピーによって割り当てられた同じメモリが解放され、未定義の動作が発生します。この問題を解決するには、ディープ コピー コンストラクターを実装してバッファを複製し、各コピーに独自の独立したメモリ割り当てが確保されるようにする必要があります。

Class::Class(const Class& another) {
    stored = new char[strlen(another.stored)   1];
    strcpy(stored, another.stored);
}

void Class::operator=(const Class& another) {
    char* temp = new char[strlen(another.stored)   1];
    strcpy(temp, another.stored);
    delete[] stored;
    stored = temp;
}

例 2: 参照カウントされたオブジェクトのコピーの制御

特定のクラスは、動的に割り当てられたオブジェクトの存続期間を管理するために参照カウントを使用する場合があります。このようなクラスをデフォルトでコピーすると、参照カウントが不正確になります。カスタム コピー コンストラクターを使用すると、適切な参照カウントを確保し、メモリ リークや早期のオブジェクト破壊を防ぐことができます。

例 3: コピー不可能なメンバーを持つオブジェクトのコピー

クラスには、コピーできないメンバーが含まれる場合があります。 -ファイルハンドルやネットワーク接続などのコピー可能なメンバー変数。デフォルトのコピー コンストラクターはそのようなメンバーを処理できないため、コピー中にコピー不可能なメンバーを切り離すなどの適切なアクションを実行するカスタム コピー コンストラクターが必要になります。

これらのシナリオを理解することで、プログラマはユーザー定義のコピー コンストラクターが不可欠な状況を効果的に識別できます。 C アプリケーション内で最適なオブジェクトの初期化と安全なコピー動作を保証します。

リリースステートメント この記事は次の場所に転載されています: 1729673772 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3