ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
オブジェクト指向プログラミング言語において、あるオブジェクトを生成する際に実行される処理やメンバー関数のこと。日本語で構築子ともいう。
一般的にはメモリーの確保や初期化など、そのクラスを利用するための初期設定をするのに用いられる。
コンストラクターは、必要がなければ作る必要はない。その場合でも、コンパイラーが自動的に適切な処理をする(デフォルトコンストラクター)が、そこでコンパイラーが何をしているかをプログラマーが意識する必要はない。
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では、基本的にはclassは引数なしのコンストラクターを保持するべきである。
無くても一見動作はするが、それを使う処理に対して様々な制約を課すことになり、また意図せぬ不具合を引き起こす原因にもなる。
但し、例えばAndroidのDB操作によく使うSQLiteOpenHelperなどは引数なしのコンストラクターが定義されていないため、super()で親クラスのコンストラクターを呼ぶ際に引数が必須となることから、この場合は引数のついたコンストラクターのみを書くことになる。引数のないコンストラクターを定義しないことに伴うサブクラス作成時の混乱を避けるため、こういったクラスは継承の必要が無いときはfinalで定義し継承を禁止しておいた方が安全である。
なお、引数なしのコンストラクターが定義されていない場合、引数なしでクラスをインスタンス化しようとした時にjava.lang.InstantiationException例外がスローされる。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます