今回はSIZE(20){ COLOR(#ffaa00){ コンストラクタ}}とSIZE(20){ COLOR(#ffaa00){デストラクタ}}についてやります

インスタンス作成(クラス変数のメモリが確保)されたときに
SIZE(20){ COLOR(#ffaa00){ 必ず呼ばれる}}特殊なメンバ関数をSIZE(20){ COLOR(#ffaa00){ コンストラクタ}}と呼びます
SIZE(20){ COLOR(#ffaa00){ メンバ変数の初期化が行えます}}

インスタンスが(クラス変数のメモリが)破棄されたときに
SIZE(20){ COLOR(#ffaa00){ 必ず呼ばれる}}特殊なメンバ関数をSIZE(20){ COLOR(#ffaa00){ デストラクタ}}と呼びます
SIZE(20){ COLOR(#ffaa00){ メンバ変数の後処理(deleteやライブラリを破棄するなど)が行えます}}

SIZE(20){ COLOR(#ffaa00){ コンストラクタ、デストラクタはクラス名と同名で戻り値がありません}}(これが目印ともいえる)


今回使うファイルは次のようになってます。どぞー(-ω-)つ旦
・&ref(constructer_destructer.cpp);
zipでほしい人はこちら
・&ref(constructer_destructer.zip);
 
 ////////////////////////////////////////
 //	コンストラクタ・デストラクタ
 ////////////////////////////////////////
 
 #define _CRT_SECURE_NO_WARNINGS
 #include <stdio.h>
 #include <string.h>
 
 // プレイヤークラス
 class Player
 {
 public:	
	char	Name[256];
	int		HP;
	int		MP;
	FILE*	fp;	// ファイルポインタ
 
	// コンストラクタ(クラス名と同名で戻り値なし)
	// インスタンス(クラス変数のメモリ)が作成されたとき必ず呼ばれる特殊なメンバ関数
	Player();
	// デストラクタ(クラス名と同名で戻り値なし、先頭に~チルダをつける)
	// インスタンス(クラス変数のメモリ)が破棄されたとき必ず呼ばれる特殊なメンバ関数
	~Player();
 
	// セーブ
	void Save(const char* FileName);
 };
 
 // コンストラクタ(戻り値なし)
 Player::Player()
 {
	// メンバ変数の初期化をする
	strcpy(Name,"Player");
	HP = 0;
	MP = 0;
	printf("%s コンストラクタが呼ばれた\n",Name);
	fp = NULL;
 }
 
 // デストラクタ
 Player::~Player()
 {
	printf("%s デストラクタが呼ばれた\n",Name);
	// メンバ変数の後処理を行う
	if(fp != NULL){
		fclose(fp);
		printf("ファイルクローズ\n");
	}
 }
 
 // セーブ
 void Player::Save(const char* FileName)
 {
	if(fp == NULL){
		fp = fopen(FileName,"w");
		printf("ファイルオープン\n");
	}
 	
	fprintf(fp,"Name:%s HP = %d MP = %d\n",Name,HP,MP);	
	printf("セーブ完了\n");
 }
 
 int main(){
 
	Player* player1 = new Player;
	printf("Name:%s HP = %d MP = %d\n",player1->Name,player1->HP,player1->MP);
	delete player1;	// player1の寿命はここまで、deleteでクラス変数のメモリが解放される
 
	printf("\n\n");
 
	{
		// ローカル変数として作成
		Player player2;
		printf("Name:%s HP = %d MP = %d\n",player2.Name,player2.HP,player2.MP);
		player2.Save("save.txt");
 
	}// player2の寿命はここまで、ブロック{}の外側に出たらローカル変数は死ぬ
 
	printf("\n\n");
 
	// 配列の場合でもコンストラクタ・デストラクタは必ず呼ばれる
	Player players[4];
 
	return 0;
 }

今回の実行結果は次のようになります
&ref(constructer_destructer.jpg);

コンストラクタ、デストラクタを使いこなすと
クラスの初期化や後処理がかなり楽になるので必ずマスターしてください

前:DirectX講座8回
次:DirectX講座10回

#vote( (^ω^)楽勝だお[5],返事がない、ただのしかばねのようだ[19],ハイハイ、ワロスワロス[7])
| (^ω^)楽勝だお|5|
|返事がない、ただのしかばねのようだ|19|
|ハイハイ、ワロスワロス|7|



トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS