導入
コンストラクタが「生成時」なら、デストラクタは「破棄時」に自動で呼ばれる特別な関数です。ファイルを閉じる・メモリを解放するといった「後片付け」を任せられます。これが C++ の強力な RAII(第16章)の土台です。
説明
デストラクタは ~クラス名() という名前で、インスタンスの寿命が尽きたとき(スコープを抜ける・delete される)に自動で呼ばれます。
flowchart LR a["生成"] -->|"コンストラクタ"| b["使用中"] b -->|"スコープを抜ける"| c["デストラクタ<br/>(後片付け)"]
#include <iostream>
#include <string>
using namespace std;
class File {
string name;
public:
File(string n) : name(n) {
cout << name << " を開く" << endl; // 生成時
}
~File() {
cout << name << " を閉じる" << endl; // 破棄時(自動)
}
};
int main() {
{
File f("data.txt"); // ここで「開く」
cout << "処理中..." << endl;
} // ← ここでブロックを抜け、自動で「閉じる」
cout << "ブロックの外" << endl;
return 0;
}
// data.txt を開く / 処理中... / data.txt を閉じる / ブロックの外
「開いたら必ず閉じる」「確保したら必ず解放する」を人間が覚えておくのは大変ですが、デストラクタに書いておけば C++ が自動で呼んでくれます。閉じ忘れ・解放忘れを構造的に防げるのが利点です。
まとめ
デストラクタ ~クラス名() は破棄時に自動で呼ばれ、後片付けを担います。「取得した資源はデストラクタで返す」という考え方が RAII で、C++ の安全性の要になります(第16章で本格的に扱います)。