C++ デストラクタとは?

クラスのメンバ関数には、特殊なモノが存在します。

コンストラクタデストラクタです。

ここではデストラクタについて説明します。
(コンストラクタについてはコチラ。)


コンストラクタは、クラスのインスタンス作成時に
自動的に呼ばれる特殊なメンバ関数でしたが、

デストラクタは、
そのインスタンスが破棄される直前に自動的に
呼ばれる特殊なメンバ関数です。

故意に呼ぶ事もできますが、推奨しません。

デストラクタで行う処理はあまり多くはありませんが、
あるとすれば、クラス内で確保した動的なメモリを解放する処理くらいです。

デストラクタの名前は、
クラス名の前に~(チルダ)を付けたモノになります。

クラス名がhitoならば、デストラクタ名は、~hitoになります。

引数や戻り値は設定できません。(void記述も不要。)

デストラクタ利用例

ファイル名:keisan.h

class keisan {
public:
int *ip;

keisan();           // コンストラクタ
~keisan();          // デストラクタ

int *tasizan(int x, int y);

};

ファイル名:keisan.cpp

#include "keisan.h"

keisan::keisan() {
      ip = new int;
}

keisan::~keisan() {
      delete ip;
}

int *tasizan(int x, int y) {
      *ip = x + y;
      return ip;
}

ファイル名:main.cpp

#include <iostream>
#include "keisan.h"

using namespace std;

void main(void) {
      keisan obj;
      int *ans;

      ans = obj.tasizan(10, 5);

      cout << "10+5=" << *ans << "です" << '\n';
}

この例では、クラスkeisanのメンバ関数tasizanで足し算の結果を求め、
coutで表示するプログラムです。
(実際にはあまり意味のないプログラムです。)

まず、コンストラクタでは、
動的にint型のメモリ領域を確保しています。

この領域は、足し算の結果を格納するための領域として使っています。

そして、メンバ関数tasizanでは、
足し算結果を動的に確保したメモリ領域にセットし、
その領域のポインタが返され、coutで表示しています。

デストラクタは、そ
のインスタンスがもうプログラム上で使われないと判断されれば、
呼び出されます。

このプログラムでは、main関数を抜けると
クラスkeisanのインスタンスobjが使用できなくなるので、
その時点で呼ばれる事になります。

デストラクタの動作を確認したい場合は、
デストラクタ内に、coutなどで
コンソール上に出力するコードを書き加えるとよく分かります。