オブジェクト指向言語において、あるオブジェクトを生成する際に実行される処理やメンバ関数のこと。日本語で構築子ともいう。
コンストラクタは、そのクラスをインスタンス化した際に、自動的に呼び出される関数である。
コンストラクタ内で行なう処理は任意だが、経験則により、解決困難なバグの混入を防ぐためクラス外に影響を及ぼすような処理(グローバル変数へのアクセスなど)は避けるべきだとされている。
一般的にはメモリの確保や初期化など、そのクラスを利用するための初期設定をするのに用いられる。
コンストラクタは、必要がなければ作る必要はない。その場合でも、コンパイラが自動的に適切な処理をするが、そこでコンパイラが何をしているかをプログラマが意識する必要はない。
C++では、コンストラクタの関数名は、クラス名と同じとする。
例えばクラス名がCTestであるなら、classの定義にてCTest();などを宣言し、CTest::CTest()として処理を記述することになる。
具体的には、このようにして定義したクラスを、次のようにした時に呼び出される。
CTest Test;
なお、次のような方法ではコンストラクタは呼び出されない。
CTest *p;
これは、単にポインタを宣言しているだけだからであり、クラスの実体(インスタンス)は作られていないからである。
但し、newでオブジェクトを生成した場合もコンストラクタは呼ばれるので、次の場合にはコンストラクタは呼び出される。
CTest *p = new CTest;
また、C++では「引数付きコンストラクタ」というものも利用可能である。関数名は、同様にクラス名と同じである。C++では同じ名前の関数であっても、引数が異なれば多重定義できる。
例えば、次のような関数を作ることができる。
CTest::CTest(int num, char *str)
これを用いると、引数を付けてクラスを利用することができる。
CTest Test(123, "ABC");
これにより、クラスのインスタンス化時に同時に値の初期設定ができる。
C++では、コンストラクタを使う上で幾つかの注意点がある。
例外を発生させてしまうと、資源の開放忘れやメモリリークを引き起こし、結果として解決困難なバグに悩まされることになる。例外が起きそうな箇所には必ずtry〜catchで蓋をして、そこから外に例外が飛び出さないように気をつける必要がある。