0からのゲームプログラミング > コンストラクタ・デストラクタ

Back Next
更新日 2003.09.28
コンストラクタ・デストラクタ

 クラスを使うことのメリットの一つに、コンストラクタ(constructor)デストラクタ(destructor)があります。メモリにクラスの実体(インスタンス, instance)が作成されたとき、自動的に一度だけ呼ばれるのがコンストラクタで、その実体がメモリから破棄されたときに自動的に一度だけ呼ばれるのがデストラクタです。

 コンストラクタは、クラスと同じ名前を持ち、戻り値がありません。デストラクタは、クラス名の前にチルダ(~)を付けた名前を持ち、引数・戻り値がありません。チルダ(~)は Shift キーを押しながらキーボードの右上の方の(^)のキーを押すと入力出来ます。


サンプルコード Main.cpp

#include	"Hero.h"

void main(void)
{
	// CHeroクラスオブジェクトの宣言
	CHero	hero;

	hero.PrintStatus();
}

サンプルコード Hero.cpp

#include	<stdio.h>
#include	"Hero.h"

// --- CHero クラスの実装 ---

// コンストラクタ(constructor)
CHero::CHero()
{
	printf("constructor !!\n");

	m_lLife = 35;
	m_lStrength = 15;
}

// デストラクタ(destructor)
CHero::~CHero()
{
	printf("destructor !!\n");
}

// ステータスを表示する
void CHero::PrintStatus(void)
{
	printf("勇者のライフ:%d\n", m_lLife);
	printf("勇者の力  :%d\n", m_lStrength);
}

サンプルコード Hero.h

// CHero クラスの定義
class CHero{
	long	m_lLife;		// ライフ
	long	m_lStrength;	// 力
public:
	CHero();
	~CHero();
	void PrintStatus(void);
};

実行結果
constructor !!
勇者のライフ:35
勇者の力  :15
destructor !!

 デバッグしてコードを追えば、どのタイミングでコンストラクタとデストラクタが呼ばれるかが分かります。


 最初の内は、クラスを書くのが面倒に感じるかも知れません。書き方を覚えていたとしても、一々同じようなコードを、クラスを追加する毎に書くのは大変です。そこで、以下のようなスケルトンコードを作成して保存しておくと便利です。新しいクラスを追加する際には、Hero と __HERO_H__ の文字だけを置換すれば、簡単に作成出来ます。

スケルトンコード Hero.cpp

#include	"Hero.h"


// --- CHero クラスの実装 ---

// コンストラクタ
CHero::CHero()
{
}


// デストラクタ
CHero::~CHero()
{
}


// 動作
// 引数・戻値なし
void CHero::Move(void)
{
}


// 描画
// 引数・戻値なし
void CHero::Draw(void)
{
}

スケルトンコード Hero.h

#ifndef	__HERO_H__
#define	__HERO_H__


// CHero クラスの定義
class CHero{
public:
	CHero();
	~CHero();
	void Move(void);
	void Draw(void);
};


#endif


 ヘッダファイルには、#から始まる3行を追加しています。意味は、もし __HERO_H__ が定義されていなければ、__HERO_H__ を定義して、#endif まで処理することを意味します。つまり、ヘッダファイルに書かれたソースを2重にインクルードしない為の細工になります。試しに、最初の Main.cpp のファイルで、
 #include "Hero.h"
 #include "Hero.h"
と、2重にインクルードしてみて、違いを確認してみて下さい。この細工をしていなければ、コンパイルエラーが起こります。最初の例では、特にこの細工をする必要はありませんが、プログラムが複雑になってくると、どうしても2重にインクルードしてしまうときがある為に、この細工を行います。Visual C++ を使っているなら、この3行の代わりに、
 #pragra once
と書けば、このことを自動的にやってくれます。


 そろそろゲーム作成の話題に移ろうかと思っていますが、上のスケルトンコードには、コンストラクタとデストラクタの他に、Move 関数 <動作…計算のみを行う>Draw 関数 <描画…画面に表示させる処理のみを行う> を追加しています。なぜ、このように分けているかということは、そのときになったら説明することにします。

【スポンサード リンク】


Back Next

0からのゲームプログラミング > コンストラクタ・デストラクタ