3:コンとデスのタイミング
C++には、オブジェクトを作成したときに自動で実行される関数「コンストラクタ」と、破棄されるときに自動で実行される関数「デストラクタ」という概念があります。コンストラクタ関数はクラス名と同じ名前、デストラクタはクラス名と同じ名前の先頭にチルダ(~)文字を付け加えることで用意することができます。コンストラクタには引数をつけることができますが、コンストラクタ・デストラクタともに戻り値は存在しませんので、戻り値を用意してはいけません。
class CHouse
{
public:
CHouse(); //コンストラクタ
~CHouse(); //デストラクタ
};
CHouse::CHouse()
{
//初期化処理
}
CHouse::~CHouse()
{
//後処理
}大雑把ですが、これらの関数は以下のタイミングで実行されるといってよいでしょう。
コンストラクタ
- オブジェクトをnewで作成したとき
- ポインタ型ではないオブジェクトの宣言をしたとき
デストラクタ
- newで作成したオブジェクトをdeleteで破棄したとき
- ポインタ型ではないオブジェクトにおいて、プログラムが宣言された括弧から抜け出したとき
次のプログラムを記述してコンパイル・実行すると
#includeclass CHouse { private: int nID; public: CHouse(int ID); //コンストラクタ ~CHouse(); //デストラクタ }; CHouse::CHouse(int ID) { nID = ID; printf("%d のコンストラクタ実行\n", nID); } CHouse::~CHouse() { printf("%d のデストラクタ実行\n", nID); } void main() { CHouse house(0); CHouse *ptr_house = new CHouse(1); for(int i = 2; i <= 3; i++){ CHouse roop_house(i); } int j = 0; if(j == 0){ CHouse house(4); { CHouse house(5); } } delete ptr_house; }
以下のような結果が出力されます。上のプログラムコードを順に追ってみましょう。つい先ほど説明した実行条件に一致していることがおわかりいただけるかと思います。
0 のコンストラクタ実行 1 のコンストラクタ実行 2 のコンストラクタ実行 2 のデストラクタ実行 3 のコンストラクタ実行 3 のデストラクタ実行 4 のコンストラクタ実行 5 のコンストラクタ実行 5 のデストラクタ実行 4 のデストラクタ実行 1 のデストラクタ実行 0 のデストラクタ実行
これは余談ですが、36行目と38行目にあった中括弧は、一見プログラムミスのように見えますが、これはC言語で認められている手法で、この括弧の中で宣言された変数やクラスはその括弧を抜けるとともに破棄されます。switch文内で特定の場所にしか使用しない変数を使いたいときにしばしば用いられていますので、覚えておいて損はないでしょう。
switch(i){
case 0:
int j = 9; //これはエラーになる
printf("%d", j);
break;
case 1:
{
int k = 5; //これは実行可能
printf("%d", k);
}
break;
default:
break;
}

