今回は コンストラクタと デストラクタについてやります インスタンス作成(クラス変数のメモリが確保)されたときに インスタンスが(クラス変数のメモリが)破棄されたときに コンストラクタ、デストラクタはクラス名と同名で戻り値がありません(これが目印ともいえる) 今回使うファイルは次のようになってます。どぞー(-ω-)つ旦 //////////////////////////////////////// // コンストラクタ・デストラクタ //////////////////////////////////////// #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; } コンストラクタ、デストラクタを使いこなすと
|