今日やったところ
class
クラス=変数+関数 ⇒何か対象物を表します
車class, ゲームキャラclass, 人class, 猫class…
class
アクセス権 ⇒ private(非公開), public(公開)
メンバ変数
メンバ関数
class 名前 { int a,b,c; //private扱い public: こっから下はパブリック private: こっから下はプライベート public: こっから。。。 }; structはデフォルトがpublic struct 名前 { int a,b,c; //pubic扱い private: こっから下はプライベート public: こっから。。。 };
コンストラクタ(constructor)、デストラクタ(destructor)
- コンストラクタ
- classと同じ名前で、戻り値のない特殊な関数(引数はあるよ)
- classのメンバ変数の初期化を行うための関数
- classのインスタンスが生成されるときに呼ばれます
- コンストラクタにメンバイニシャライザを書いてメンバ変数を初期化することもできるよ
- デストラクタ
- classと同じ名前の初めに~を付けた名前で、引数・戻り値のない特殊な関数 : classのメンバ変数の初期化を行うための関数 : classのインスタンスが生成されるときに呼ばれます
コンストラクタはオブジェクトができるとき
class abc;が既に定義済みの時
{
abc myinstance; //abcクラスのインスタンスmyinstance
//メモリが確保されると同時にコンストラクタが呼ばれる
//ごにょごにょ
} //このブロックでabcは破棄されるので、ここでデストラクタが呼ばれる
コンストラクタ、デストラクタの呼ばれる順番
#include <iostream> using namespace std; class foo { int x,y; public: //コンストラクタ foo():x(0),y(0) { print(); cout << "コンストラクタだよ" << endl; } //インライン定義 foo(int _x, int _y):x(_x),y(_y) { print(); cout << "コンストラクタだよ" << endl; } //インライン定義 //オーバーロード関数 //デストラクタ ~foo() { print(); cout << "さよならfoo" << endl; } void print() {cout <<"(" << x <<", " << y <<")" <<endl;} }; int main() { foo a; //でふぁおるとのコンストラクタで(0,0)に初期化される { a.print(); foo b(1, 1); } //b.print(); ブロック外ではアクセスできない }
- 実行結果
(0, 0) コンストラクタだよ (0, 0) (1, 1) コンストラクタだよ (1, 1) さよならfoo (0, 0) さよならfoo