C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のデストラクタとは?基本構文と使い方を実例で解説

デストラクタ(Destructor)は、C++のクラスに属する特別なメンバ関数の一つで、オブジェクトを破棄する役割を担います。関数の終了やプログラムの終了、deleteによる明示的な削除など、オブジェクトがスコープ外に出るタイミングで自動的に呼び出されます。

デストラクタは通常のメンバ関数とは異なり、引数を受け取らず、戻り値も返しません。また、クラス名と同じ名前を持ち、その先頭にはチルダ(~)を付けるのが決まりです。なお、デストラクタはオーバーロードできないため、1つのクラスに定義できるのは1つだけという点にも注意しましょう。

以下に、C++におけるデストラクタの動作を確認できるサンプルプログラムを示します。

サンプルプログラム

#include<iostream>
using namespace std;
class Demo {
    private:
    int num1, num2;
    public:
    Demo(int n1, int n2) {
        cout<<"Inside Constructor"<<endl;
        num1 = n1;
        num2 = n2;
    }
    void display() {
        cout<<"num1 = "<< num1 <<endl;
        cout<<"num2 = "<< num2 <<endl;
    }
    ~Demo() {
        cout<<"Inside Destructor";
    }
};
int main() {
    Demo obj1(10, 20);
    obj1.display();
    return 0;
}

実行結果

Inside Constructor
num1 = 10
num2 = 20
Inside Destructor

プログラムの解説

上記のプログラムでは、クラスDemoの中に、引数n1n2を使ってメンバ変数num1num2を初期化するパラメータ付きコンストラクタが定義されています。また、num1num2の値を画面に出力するdisplay()関数も用意されています。

さらに、Demoクラスにはデストラクタ~Demo()が定義されており、オブジェクトのスコープが終了した時点で自動的に呼び出されます。該当するコード部分は以下の通りです。

class Demo {
    private:
    int num1, num2;
    public:
    Demo(int n1, int n2) {
        cout<<"Inside Constructor"<<endl;
        num1 = n1;
        num2 = n2;
    }
    void display() {
        cout<<"num1 = "<< num1 <<endl;
        cout<<"num2 = "<< num2 <<endl;
    }
    ~Demo() {
        cout<<"Inside Destructor";
    }
};

main()関数の処理の流れ

main()関数内では、まずDemo型のオブジェクトobj1を生成し、続いてdisplay()関数を呼び出しています。main()関数が終了するとobj1がスコープ外となるため、その時点でデストラクタが実行され、最後に「Inside Destructor」が出力されるのです。

Demo obj1(10, 20);
obj1.display();
  1. C++のコンストラクタとは?デフォルトコンストラクタと引数付きコンストラクタの使い方を解説

    C++のコンストラクタとはコンストラクタ(constructor)とは、クラスの新しいオブジェクトが生成される瞬間に自動的に呼び出される特別なメンバ関数です。コンストラクタには以下のような特徴があります。関数名がクラス名と同じである戻り値の型を持たない(voidも指定しない)オブジェクト生成時に自動的に実行されるコンストラクタの主な役割は、クラスのメンバ変数に初期値を与えることです。これにより、オブジェクトは生成された時点で適切な状態を持つことが保証されます。C++のコンストラクタには、主に「デフォルトコンストラクタ」と「引数付きコンストラクタ(パラメータ化コンストラクタ)」の2種類があります

  2. C++で仮想デストラクタを使うべき場面とは?ポリモーフィックな基底クラスの注意点

    『Effective C++』におけるスコット・マイヤーズの助言 スコット・マイヤーズは名著『Effective C++』の中で、仮想デストラクタについて次のように述べています。 「クラスが仮想関数をひとつでも持つなら、そのクラスは仮想デストラクタを持つべきである。一方、基底クラスとして設計されていないクラスや、ポリモーフィックに扱われることを意図していないクラスは、仮想デストラクタを宣言すべきではない」 つまり、ポリモーフィックな基底クラスでは、デストラクタを必ず仮想関数として宣言するのが原則です。 仮想デストラクタがないと何が起きるのか 問題が発生するのは、派生クラスのコンストラクタでオ