コンストラクタとは
ここではクラスの機能の一つであるコンストラクタとデストラクタについて解説します。
まずはコンストラクタについてです。
クラスはメンバ変数を持ちます。
ここで変数について思い出しましょう。
変数は初期化しないと使えませんね。
メンバ変数が初期化されていないと、その変数を使うメンバ関数全てに影響が出る可能性があります。
初期化の方法としてメンバ変数の宣言と同時に初期化を行うことができます。
class myClass { int member = 0; }
このような形ですね。
ただし、この方法は古いコンパイラでは対応していません。(C++11より対応)
そこで、オブジェクト生成時に行いたい機能を定義する仕組みとしてコンストラクタが用意されました。
単純な初期化の他、初期値をユーザー入力で受け取る等、初期化以外の処理も行うことができます。
コンストラクタの使い方
次にコンストラクタの使い方を説明します。
class 【クラス名】 { 【クラス名(コンストラクタ)】(【引数】); }
3行名がコンストラクタの定義になります。
実例は以下のようになります。
constractor_sample1.cpp
class myClass { myClass(); }
見ての通りコンストラクタの名前はクラスの名前と同じになります。
また、戻り値を持ちません。
コンストラクタの中身の定義は基本的にはメンバ関数と同様ですが、初期化をブロック外に書くことができます。
【クラス名】::【クラス名】(【引数】) :【メンバ変数名】(【初期化値】),… { 【処理】 }
myClassがメンバ変数a,bを持つ場合、初期化だけを行うコンストラクタは以下のようになります。
constractor_sample2.cpp
myClass::myClass() :a(0), b(0) { }
このように記述したコンストラクタが、インスタンス生成時に呼び出されます。
コンストラクタに引数を持たせる場合、インスタンス生成時に引数を与えます。
【クラス名】 【インスタンス名】(【引数】)
与えた引数の値で初期化することも可能です。
constractor_sample3.cpp
myClass::myClass(int x, int y) :a(x), b(y) { }
また、プログラマーがコンストラクタを定義しない場合、デフォルトコンストラクタと呼ばれる引数がなく、何も動作を行わないコンストラクタが呼び出されます。
コンストラクタもメンバ関数の一つである為、オーバーロードやデフォルト引数の設定がで適用できます。
詳しくはデフォルト引数と関数のオーバーロードを参照。
デストラクタとは
デストラクタはコンストラクタとは逆に、インスタンスが消滅するときに呼び出されます。
インスタンス消滅時とはそのインスタンスのスコープ外すなわち生成されたブロック外に出るときのことです。
デストラクタでは主にメモリの解放やファイルのクローズなどの処理に使われます。
コンストラクタと同様、定義しない場合はデフォルトデストラクタが呼び出されます。
デストラクタの使い方
class 【クラス名】 { ~【クラス名(コンストラクタ)】(); }
デストラクタはクラス名に~(チルダ)をつけたものとなります。
また、デストラクタでは引数をとりません。
コンストラクタと違い、明示的に呼び出すことがないので当然ですね。
ただし、()は必要です。
中身の定義も普通のメンバ関数と同様です。
【クラス名】::~【クラス名】() { 【処理】 }