>> C++入門トップに戻る

コンストラクタとデストラクタ

今回はコンストラクタとデストラクタについて説明します。
まずコンストラクタについてです。
コンストラクタとは、クラスを動的確保(インスタンスを生成)した時に、
実行される関数のことです。

通常の関数と違うことと言えば、戻り値を返せないことです。
それと、関数名がクラス名と同じになることです
下記のコードをみてください。

#include <stdio.h>

class TEST{
public:
	int figure;
	TEST(int temp){
		figure=temp;
	}
};

int main(void)
{
	//クラスTESTのポインタを宣言
	TEST *test;

	//newを使って動的確保
	test=new TEST(50);

	printf("%d\n",test->figure);
	
	delete test;

	return 0;
}

これを実行すると、50、と表示されます。

TEST関数があると思いますが、これがコンストラクタです。
コンストラクタは絶対にクラス名と同じにしなければなりません。
それと、戻り値が返せないので戻り値の場所には何も書いてないですよね?
それ以外は普通の関数です。

ではコンストラクタはどうやって実行されるのかというと、newで動的確保されたときです。
もし、引数を設定していた場合は、上記のようにTEST(50)と書きます。
これでコンストラクタに50という値を渡しているという意味になります。

上記のコードではコンストラクタの処理で、渡された引数をクラス内のfigure変数に代入しています。
その後、main関数内のprintf関数でその変数にアクセスして表示しています。
ちゃんと50と表示されているので、コンストラクタが動作してることがわかると思います。

次に、デストラクタについてですが、
コンストラクタがnewで動的確保した時に実行されていたのに対し、逆にデストラクタは、
メモリが解放されたタイミングで実行されます。
下記のコードを見てください。

#include <stdio.h>

class TEST{
public:
	int figure;
	TEST(int temp){
		figure=temp;
	}
	~TEST(){
		printf("デストラクタ実行\n");
	}
};

int main(void)
{
	//クラスTESTのポインタを宣言
	TEST *test;

	//newを使って動的確保
	test=new TEST(50);

	printf("%d\n",test->figure);

	delete test;

	return 0;
}

これを実行すると、50、と、「デストラクタ実行」と表示されます。
デストラクタの書き方は、
クラス名の前にチルダ(~)をつけるだけです。
コンストラクタと同じように戻り値は返せませんし、チルダの後ろはクラス名と同じにしなければなりません。
デストラクタの実行タイミングは、メモリが解放されたときです。
つまり、delete関数が実行されたときです。

コンストラクタはクラス内の変数の値の初期化などで、用途が結構ありそうな気はしますが、
デストラクタは使うことあるかなぁ?と考えている人も多いと思います。
私も最初は使いませんでしたが、大規模なプログラムを組むようになってくると、
クラス内でメモリの動的確保をしたりします。
その時の解放処理をするために、デストラクタをよく利用するようになりました。

別にこの関数は絶対使わなければいけないわけじゃありません。
ですが、覚えておくと便利なのでしっかり覚えておきましょう。

次回はクラスの継承について説明します。


>> 【クラスの継承】に進む
>> C++入門トップに戻る