[習熟のための C++ 入門] C++ 入門 - クラスとオブジェクト (コンストラクター、デストラクター)

目次

1. クラスの 6 つのデフォルトのメンバー関数

 2 番目に、コンストラクター

⭕コンストラクターのコンセプト

⭕コンストラクターの機能

⭕ いくつかの種類の一般的なコンストラクター

3. デストラクター

     ⭕デストラクターの概念

    ⭕デストラクタの特徴

⭕ いくつかの種類の一般的なデストラクター

4. ヒント


序文

         この記事は前回の記事の続きです (前回の記事へのリンクはここにあります)。以前は C 言語の基本について話し、いくつかのデータ構造についても学び、C++ 名前空間と C++ についてのいくつかの知識ポイントについて話しました。 . デフォルトのパラメーター、関数のオーバーロード、参照関数、およびインライン関数。次に、ブロガーが C++ クラスとオブジェクトに関するさらに重要な知識ポイントを学習し続けるよう導きます。次に言うことはあまりありません。じっと座って私たちをサポートしてください。私たちは運転するつもりです。

1. クラスの 6 つのデフォルトのメンバー関数

        クラスにメンバーが存在しない場合、そのクラスは単に空のクラスと呼ばれます。空のクラスには本当に何もないのでしょうか?いいえ、どのクラスも何も書き込まない場合、コンパイラは次の 6 つのデフォルトのメンバー関数を自動的に生成します。デフォルトのメンバー関数: ユーザーが明示的に実装せずにコンパイラによって生成されたメンバー関数は、デフォルトのメンバー関数と呼ばれます。

        1.デフォルト コンストラクター (Default Constructor) : クラスでコンストラクターが定義されていない場合、コンパイラーはデフォルト コンストラクターを自動的に生成します。デフォルトのコンストラクターにはパラメーターがなく、オブジェクト作成時の初期化に使用されます。

        2.デストラクター (Destructor) : デストラクターはオブジェクトが破棄されるときに呼び出され、動的に割り当てられたメモリの解放、ファイルのクローズなど、オブジェクトによって占有されているリソースを解放するために使用されます。デストラクターにはパラメーターがなく、その名前はチルダ (~) で始まり、その後にクラス名が続きます。

        3.コピー コンストラクター (コピー コンストラクター) : コピー コンストラクターは、既存のオブジェクトのデータ メンバーを別のオブジェクトにコピーするために使用されます。コピー コンストラクターは、オブジェクトを使用して別のオブジェクトを初期化するとき、関数パラメーターが値でオブジェクトを渡すとき、またはオブジェクトが値で返されるときに、自動的に呼び出されます。コピー コンストラクターは、同じ型のオブジェクトへの参照型のパラメーターを 1 つ受け取ります。

        4.コピー代入演算子 (コピー代入演算子) : コピー代入演算子は、既存のオブジェクトのデータ メンバーを別のオブジェクトにコピーするために使用されます。代入演算子 = を使用してすでに初期化されているオブジェクトに値を代入すると、コピー代入演算子が自動的に呼び出されます。コピー代入演算子は、同じ型のオブジェクトへの参照型の引数を 1 つ取り、参照を返します。

        5.移動コンストラクター (移動コンストラクター) : 移動コンストラクターは、一時オブジェクトまたは破棄されるオブジェクトのリソース (動的に割り当てられたメモリなど) を別のオブジェクトに「移動」し、不必要なデータのコピーを回避するために使用されます。移動コンストラクターは、同じオブジェクトへの参照型のパラメーターを 1 つ受け取ります。

        6.移動代入演算子 (移動代入演算子) : 移動代入演算子は、一時オブジェクトまたは破棄されるオブジェクトのリソース (動的に割り当てられたメモリなど) を別のオブジェクトに「移動」し、不必要なデータのコピーを回避するために使用されます。移動代入演算子は、同じオブジェクトへの参照型の引数を 1 つ受け取り、参照を返します。

        デストラクター、コピー コンストラクター、コピー代入演算子、移動コンストラクター、または移動代入演算子のいずれかがカスタマイズされた場合、コンパイラーはこのクラスに対応するデフォルトのメンバー関数を生成しなくなることに注意してください

 2 番目に、コンストラクター

⭕コンストラクターのコンセプト

        C++ のコンストラクターは、クラスのオブジェクトを作成および初期化するために使用される特別なメンバー関数です。コンストラクターは、オブジェクトの作成時に自動的に呼び出されます。その主な目的は、オブジェクトのデータ メンバーに初期値を提供し、作成後にオブジェクトが適切な状態になるようにすることです。

⭕コンストラクターの機能

1.コンストラクターの名前はクラス名とまったく同じである必要があり、戻り値の型はありません (void さえありません)。
2. コンストラクターにはパラメーターを含めることができます。これらのパラメーターは、オブジェクトの作成時に初期化値を提供するために使用されます。これらのパラメータにはデフォルト値を設定することも、任意のタイプを指定することもできます。
3.コンストラクターはオーバーロードできます。つまり、同じ名前で異なるパラメーター リストを持つ複数のコンストラクターを定義できますこのようにして、さまざまな初期化要件に従って適切なコンストラクターを選択できます。
4.オブジェクトが作成されると、そのオブジェクトに一致するコンストラクターが自動的に呼び出されます。つまり、コンストラクターは、オブジェクトの作成時に手動で呼び出すことなく自動的に呼び出されます。
5.コンストラクターは、メモリの動的割り当て、ファイルのオープン、データ メンバーの初期化など、必要な初期化操作を実行できます。

⭕ いくつかの種類の一般的なコンストラクター

1. デフォルトのコンストラクター

        パラメーターのないコンストラクターは、オブジェクトの作成時にデフォルトの初期値を提供するために使用されます。
2. パラメータ化されたコンストラクタ

        パラメーターを受け取り、指定されたパラメーターに基づいてオブジェクトのデータ メンバーを初期化するコンストラクター。
3. コンストラクターのコピー

        同じタイプのオブジェクトをパラメータとして受け取り、既存のオブジェクトに基づいて新しいオブジェクトを作成するために使用されます。
4. 移動コンストラクター

        一時オブジェクトまたは破棄されるオブジェクトを取得し、データのコピーを実行する代わりにリソース (動的に割り当てられたメモリなど) を「移動」するために使用されます。
5. 変換コンストラクター

        他の型のオブジェクトをパラメータとして受け取り、他の型のオブジェクトをこのクラスのオブジェクトに変換するために使用されます。

        コンストラクターは、オブジェクトを作成するために外部コードによって呼び出される必要があるため、クラス定義内でパブリック アクセスを使用して宣言されます。クラスには複数のコンストラクターを含めることができ、それらはオプションで定義できます。コンストラクターが定義されていない場合、コンパイラーはデフォルトのコンストラクターを自動的に生成します。

以下は、クラス「Person」のコンストラクターの定義と使用法を示す簡単な例です。

#include <iostream>
#include <string>

class Person {
public:
    // 默认构造函数
    Person() {
        name = "Unknown";
        age = 0;
    }

    // 带参构造函数
    Person(const std::string& n, int a) {
        name = n;
        age = a;
    }

    // 打印信息的成员函数
    void printInfo() {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }

private:
    std::string name;
    int age;
};

int main() {
    // 使用默认构造函数创建对象
    Person p1;
    p1.printInfo(); // 输出:Name: Unknown, Age: 0

    // 使用带参构造函数创建对象
    Person p2("John", 25);
    p2.printInfo(); // 输出:Name: John, Age: 25

    return 0;
}

        上の例では、Person クラスにはデフォルトのコンストラクターとパラメーター化されたコンストラクターが含まれています。これら 2 つのコンストラクターを通じて、さまざまなニーズに柔軟に対応できるように、さまざまな方法で Person オブジェクトを作成することを選択できます。

3. デストラクター

     ⭕デストラクターの概念

        デストラクター: コンストラクターの機能とは異なり、デストラクターはオブジェクト自体の破棄を完了しません。ローカル オブジェクトの破棄はコンパイラーによって行われます。オブジェクトが破棄されると、自動的にデストラクターが呼び出され、オブジェクト内のリソースのクリーンアップが完了します。その主な機能は、オブジェクトによって使用されているリソースが正しく解放されるようにして、リソース リークやメモリ リークの発生を防ぐことです。

    ⭕デストラクタの特徴

1. デストラクターの名前はクラス名と同じですが、先頭にチルダ (~) が付きます。たとえば、クラスの名前が MyClass の場合、対応するデストラクターの名前は ~MyClass になります。
2. デストラクターは値を返さないため、戻り値の型 (void を含む) を持ちません。
3. デストラクターはパラメーターを受け入れないため、オーバーロードできません。また、各クラスはデストラクターを 1 つだけ持つことができます。
4. デストラクターは手動で呼び出すことはできません。オブジェクトのライフサイクルが終了すると自動的にトリガーされます。オブジェクトの破棄の状況には、オブジェクトがスコープ外になること、対応する動的に割り当てられたメモリが削除によって解放されること、およびコンテナ内のオブジェクトが削除されることが含まれます。
5. オブジェクトのデストラクタが呼び出されると、メンバ オブジェクトのデストラクタが自動的に呼び出され、定義された順序でオブジェクトが破棄されます。
6. デストラクターが明示的に定義されていない場合、コンパイラーはデフォルトで空のデストラクターを生成します。つまり、何も行いません。

        デストラクターは通常、オブジェクトが破棄されるときに、動的に割り当てられたメモリの解放、ファイル ハンドルのクローズ、他の種類のリソースの解放など、必要なクリーンアップ作業を実行するために使用されます。デストラクターを使用すると、オブジェクトによって使用されるリソースが正しく解放され、リソース リークやメモリ リークを回避できます。

以下は、FileHandler クラスのデストラクターの定義と使用法を示す簡単な例です。

#include <iostream>
#include <fstream>

class FileHandler {
public:
    FileHandler(const std::string& filename) {
        file.open(filename);
        if (!file) {
            std::cout << "Failed to open file " << filename << std::endl;
        }
    }

    ~FileHandler() {
        if (file.is_open()) {
            file.close();
            std::cout << "File closed." << std::endl;
        }
    }

    void writeToFile(const std::string& data) {
        file << data << std::endl;
    }

private:
    std::ofstream file;
};

int main() {
    FileHandler handler("example.txt");
    handler.writeToFile("Hello, world!");

    return 0;
}

        上記の例では、FileHandler クラスはファイル ハンドルをカプセル化します。コンストラクターはファイルを開いて正常に開かれたかどうかを確認するために使用され、デストラクターはオブジェクトが破棄されたときにファイルを閉じる役割を果たします。main 関数では、FileHandler オブジェクト ハンドラーが作成され、データが書き込まれます。オブジェクト ハンドラーがスコープ外になると、デストラクターが自動的に呼び出され、ファイルが閉じられます。

        適切なデストラクターを定義することで、オブジェクトが破棄されたときにオブジェクトのリソースが正しく解放されるようになり、プログラム動作の安全性と信頼性が確保されます。動的に割り当てられたメモリやその他の関連リソースを使用する場合、リソース リークを避けるためにデストラクターを明示的に定義する必要があることにも注意してください。

⭕ いくつかの種類の一般的なデストラクター

特定のニーズと状況に応じて、一般的なデストラクターは次の 4 つのタイプに分類できます。

        1.デフォルトのデストラクタ (Default Destructor) : デストラクタが明示的に定義されていない場合、コンパイラは暗黙的にデフォルトのデストラクタを生成します。デフォルトのデストラクターには実装内容はありません。その機能は、メンバー オブジェクトのデストラクターを呼び出し、定義された順序でそれらを破棄することだけです。

class MyClass {
    // 在这里没有显式定义析构函数
    // 编译器会自动生成一个默认析构函数
};

        2.仮想デストラクタ (Virtual Destructor) : クラスを継承する場合、通常は仮想デストラクタの使用を検討する必要があります。仮想デストラクターは、基底クラスの仮想関数として宣言されます。これにより、基底クラスへのポインターを通じて基底クラス オブジェクトが削除されるときに、派生クラスのデストラクターが実際に呼び出されることを保証できます。これは、デストラクターが派生クラス自体のリソースを含むすべてのリソースを適切に解放することを保証するためです。

class MyBaseClass {
public:
    virtual ~MyBaseClass() { // 声明为虚函数
        // 析构函数的实现
    }
};

class MyDerivedClass : public MyBaseClass {
public:
    ~MyDerivedClass() {
        // 派生类析构函数的实现
    }
};

        3.純粋仮想デストラクター (純粋仮想デストラクター) : 純粋仮想デストラクターは、特定の実装を持たない仮想デストラクターです。これは、基本クラスを抽象クラス、つまりインスタンス化できないクラスとして定義するために存在します。純粋な仮想デストラクターには、具体的な実装を提供する派生クラスが必要です。

class AbstractClass {
public:
    virtual ~AbstractClass() = 0; // 纯虚析构函数,没有实现
};

AbstractClass::~AbstractClass() {
    // 纯虚析构函数的实现
}

class ConcreteClass : public AbstractClass {
public:
    ~ConcreteClass() {
        // 派生类的析构函数实现
    }
};

        4.カスタム デストラクター (カスタム デストラクター) : カスタム デストラクターは、クラスの特定のニーズに従って定義されます。動的に割り当てられたメモリの解放、ファイル ハンドルのクローズ、他のリソースの解放などに使用できます。カスタム デストラクターは、クラスの設計に従って、適切なタイミングでリソースをクリーンアップしてリサイクルする必要があります。

class MyClass {
public:
    ~MyClass() {
        // 自定义的析构函数实现
        // 释放资源,关闭文件等
    }
};

        ニーズに応じて、適切なデストラクターの種類を選択してください。ほとんどの場合、基本的なニーズにはデフォルトのデストラクターで十分ですが、ポリモーフィズムと継承に関しては、仮想デストラクターの使用が必要になる場合があります。抽象クラスの場合は、純粋な仮想デストラクターを使用できます。カスタム デストラクターは、より柔軟なリソース クリーンアップ機能を提供します。

4. ヒント

        ブロガーの記事にご注目とサポートをいただきありがとうございます。この記事をお読みになり、貴重なコメントやフィードバックを残していただきありがとうございます。この記事が気に入ったら、「いいね!」、コメント、クラスメートと共有していただければ、大きな励みとサポートになります。さらに、ブロガーは今後の更新でこの記事に関連するコンテンツについて引き続き議論する予定です。C++ とプログラミングの技術的な問題、応用例、興味深いゲームプレイなどについて、より詳細な分析をお届けします。引き続きブロガーの更新に注目して、エキサイティングなコンテンツを見逃さないようにしてください。

        これからも、もっと刺激的で面白い記事やコンテンツをお届けしていきます。この記事に関連したコンテンツも続々と登場してまいりますので、今後とも当社の動向にご注目いただければ幸いです。残りのコピー コンストラクター、代入演算子のオーバーロード、const メンバー、アドレス取得および const アドレス取得演算子のオーバーロードについては、次のリンクを参照してください。次のリンク:コピー コンストラクター、代入演算子のオーバーロード、const メンバー関数

        ご支援とご配慮に改めて感謝申し上げます。私たちは、皆さんとより緊密な対話を確立し、C++、アルゴリズム、プログラミングの謎を一緒に探索できることを楽しみにしています。幸せな生活とスムーズな排便を願っています。

 

おすすめ

転載: blog.csdn.net/m0_75215937/article/details/131956397