コンストラクタ
コンストラクタ
インスタンス化の時に自動的に呼び出される特殊なメンバ関数を,コンストラクタ (constructor) といいます。
コンストラクタは,返り値のない (void すら書かない),クラスと同名のメンバ関数として定義します。
次のプログラムは,時計を表す Clock クラスを定義したものです。
#include <iostream>
class Clock
{
public:
int hour;
int minute;
Clock(int hour, int minute); // コンストラクタ
};
Clock::Clock(int hour, int minute)
{
this->hour = hour;
this->minute = minute;
}
int main()
{
Clock c(6, 30);
}
コンストラクタが引数を持つ場合,インスタンス化は Clock c(6, 30); のように書きます。
デフォルトコンストラクタ
引数を持たないコンストラクタを,デフォルトコンストラクタといいます。
自前のコンストラクタを定義しなかった場合,コンパイラは暗黙のうちにデフォルトコンストラクタを実装します。
デフォルトコンストラクタは,クラス型のインスタンスメンバに対してはそのデフォルトコンストラクタを呼び出しますが,組込み型のインスタンスメンバの初期化は行いません。
プログラマが自前のコンストラクタを定義した場合,コンパイラはデフォルトコンストラクタを実装しません。
よって,今回の Person クラスでは,インスタンス化を次のように書くことはできません。
int main()
{
Clock c; // エラー: デフォルトコンストラクタは存在しない
}
初期化子リスト
コンストラクタにおけるメンバ変数初期化には,次のように初期化子リスト (メンバイニシャライザ) が使えます。
初期化子リストは const インスタンスメンバ変数の初期化も可能です。
class Clock
{
public:
int hour;
int minute;
Clock(int hour, int minute);
};
Clock::Clock(int h, int m)
: hour(h), minute(m) // 初期化子リスト
{
}
初期化子リストを用いない方法では,次の手順でメンバ変数初期化が行われます。
- メンバ変数のデフォルトコンストラクタを呼び出す
- メンバ変数に対し代入演算を行う (コンストラクタ本体の実行)
初期化子リストを用いる方法では,デフォルトコンストラクタを呼び出す代わりに,初期化子リストにあるコンストラクタを呼び出します。
そのため,インスタンス化時のオーバーヘッドを軽減できます。
デストラクタ
インスタンスが破棄される時に自動的に呼び出される特殊なメンバ関数を,デストラクタ (destructor) といいます。
デストラクタは,返り値と引数を持たず,クラス名の頭に ~ を付けた名前のメンバ関数として定義します。
class Class1
{
public:
~Class1(); // デストラクタ
};
Class1::~Class1() { ... }