コンストラクター
読み:コンストラクター
外語:constructor

 オブジェクト指向プログラミング言語において、あるオブジェクトを生成する際に実行される処理やメンバー関数のこと。日本語で構築子ともいう。
目次

概要
 コンストラクターは、そのクラスをインスタンス化した際に、自動的に呼び出される関数である。
 コンストラクター内で行なう処理は任意だが、経験則により、解決困難なバグの混入を防ぐためクラス外に影響を及ぼすような処理(グローバル変数へのアクセスなど)は避けるべきだとされている。

特徴

基本
 一般的にはメモリーの確保や初期化など、そのクラスを利用するための初期設定をするのに用いられる。
 コンストラクターは、必要がなければ作る必要はない。その場合でも、コンパイラーが自動的に適切な処理をする(デフォルトコンストラクター)が、そこでコンパイラーが何をしているかをプログラマーが意識する必要はない。

C++

コンストラクター
 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で蓋をして、そこから外に例外が飛び出さないように気をつける必要がある。

Java

コンストラクター
 Javaでは、コンストラクターの関数名は、クラス名と同じでなければならない。
 コンストラクターは値を返すことはできない。
 コンストラクターを書かないことも可能で、その場合は自動的にデフォルトコンストラクターが挿入される。
 引数付きコンストラクターを作成することは可能だが、何らかのコンストラクターを記述した場合はデフォルトコンストラクターは挿入されない。

引数なしのコンストラクター
 Javaでは、基本的にはclassは引数なしのコンストラクターを保持するべきである。
 無くても一見動作はするが、それを使う処理に対して様々な制約を課すことになり、また意図せぬ不具合を引き起こす原因にもなる。
 但し、例えばAndroidのDB操作によく使うSQLiteOpenHelperなどは引数なしのコンストラクターが定義されていないため、super()で親クラスのコンストラクターを呼ぶ際に引数が必須となることから、この場合は引数のついたコンストラクターのみを書くことになる。引数のないコンストラクターを定義しないことに伴うサブクラス作成時の混乱を避けるため、こういったクラスは継承の必要が無いときはfinalで定義し継承を禁止しておいた方が安全である。
 なお、引数なしのコンストラクターが定義されていない場合、引数なしでクラスをインスタンス化しようとした時にjava.lang.InstantiationException例外がスローされる。

再検索