C++講座6回です 今回のサンプル クラスに自分が定義しなくてもデフォルトで定義されていて ○コンストラクタ コンストラクタ・コピーコンストラクタ・デストラクタ コンストラクタ名はクラス名と同じにする必要があります。 class Test{ public: // コンストラクタ(戻り値無し) Test(); }; // コンストラクタ実装 Test::Test(){ printf("コンストラクタが呼ばれました\n"); } コンストラクタには初期化子があります class Test{ public: int HP; int MP; // コンストラクタ Test(); }; // コンストラクタ実装 Test::Test():HP(100),MP(10) {} また、コンストラクタはオーバロードすることができ、 class Test{ public: // コンストラクタのオーバーロード Test(int hp,int mp); }; // コンストラクタ実装 Test::Test(int hp,int mp):HP(hp),MP(mp) { printf("コンストラクタ(引数付き)が呼ばれました\n"); } int main(){ Test test(200,30); //生成 Test* ptest = new Test(300,20); // 動的生成 delete ptest; return 0; } 次にコンストラクタの全ソースを示しておきます //main.cpp #include <iostream> class Test{ public: int HP; int MP; // コンストラクタ(戻り値無し) Test(); // コンストラクタのオーバーロード Test(int hp,int mp); }; // コンストラクタ実装 Test::Test():HP(100),MP(10) { printf("コンストラクタが呼ばれました\n"); } // コンストラクタ実装 Test::Test(int hp,int mp):HP(hp),MP(mp) { printf("コンストラクタ(引数付き)が呼ばれました\n"); } int main(){ Test test1; // インスタンス化 printf("test1 HP = %d,MP = %d \n\n",test1.HP,test1.MP); Test test2(200,30); // 引数付きインスタンス化 printf("test2 HP = %d,MP = %d \n\n",test2.HP,test2.MP); printf("動的インスタンスの場合\n"); Test* ptest1 = new Test(); // 動的インスタンス化も呼ばれる delete ptest1; printf("動的インスタンス引数付きの場合\n"); Test* ptest2 = new Test(300,20); // 動的インスタンス化引数付き delete ptest2; printf("\n配列の場合\n"); Test test[5]; // 配列の場合でも個数分呼ばれる return 0; } コピーコンストラクタはコンストラクターのオーバロードで引数は必ず(const クラス名&) とします class Test{ public: // コピーコンストラクタを定義するときはコンストラクタの定義も必要 Test(){} // コピーコンストラクタ(戻り値なし) Test(const Test& obj); }; // コピーコンストラクタ実装 Test::Test(const Test& obj){ printf("コピーコンストラクタが呼ばれました\n"); } 次にコピーコンストラクタの全ソースを示しておきます // main.cpp #include <iostream> class Test{ public: // コピーコンストラクタを定義するときはコンストラクタの定義も必要 Test(){} // コピーコンストラクタ(戻り値なし) Test(const Test& obj); }; // コピーコンストラクタ実装 Test::Test(const Test& obj){ printf("コピーコンストラクタが呼ばれました\n"); } int main(){ Test test1; Test test2 = test1; // インスタンスの初期化時にコピーコンストラクタが呼ばれる test2 = test1; // 代入は初期化じゃないのでコピーコンストラクタは呼ばれない return 0; } デストラクタ名はクラス名と同じにします class Test{ public: // デストラクタ(戻り値なし ~(チルダ)を先頭につける) ~Test(); }; // デストラクタ実装 Test::~Test() { printf("デストラクタが呼ばれました\n"); } 次にデストラクタの全ソースを示しておきます // main.cpp #include <iostream> class Test{ public: // デストラクタ(戻り値なし ~(チルダ)を先頭につける) ~Test(); }; // デストラクタ実装 Test::~Test() { printf("デストラクタが呼ばれました\n"); } int main(){ { Test test; } // ブロックの外でtestの寿命が尽きる、このときデストラクタが呼ばれる Test* ptest = new Test(); delete ptest; // 動的インスタンスが破棄されてもデストラクタは呼ばれる return 0; } |