コンストラクタ(英: constructor)は、オブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行なう関数あるいはメソッドのことである。対義語はデストラクタ。
オブジェクトの生成は、
- メモリ割当(英: allocation)
- 初期化(英: initialization)
の二段階を経て行なわれるが、コンストラクタを持つプログラミング言語ではメモリ割り当ては言語機能に組み込まれ、初期化用のコードのみを記述するのが普通である。
JISでは、「構築子」という直訳が割り当てられている規格もあるが[注釈 1]、「コンストラクタ」という用語が使われている規格もある[注釈 2]。
長音符を付けた「コンストラクター」という表記を採用しているドキュメントもある[4][5]。
クラスベース言語でのコンストラクタ
C++、Java、C#、PHPなど、クラスベースのオブジェクト指向言語では、コンストラクタはクラスのメンバとして定義される。
C++、Java、C#のコンストラクタは、「クラス名と同一の名前を持ち、戻り値指定のない関数(メソッド)」であるかのような記法となっている。以下にJavaの例を示す。
class SomeClass {
SomeClass(/*引数リスト*/) {
// 初期化用のコード
}
}
SomeClass obj = new SomeClass(/*引数リスト*/);
なお、コンストラクタについて「クラス名と同一の名前を持つ関数(メソッド)」と説明している場合がある[要出典]が、C++やJavaでは厳密にいえばこれは誤りであり、コンストラクタには名前はない。C++では「クラス名と同一の名前を持つメンバー関数」を定義することはできない。一方、Javaでは「クラス名と同一の名前を持つメソッド」を、コンストラクタとは別に定義可能であるが、これは混乱を招くだけでなく、「クラス名を大文字で始め、メソッド名を小文字で始める」というJava公式の慣習に反することにもなるため、通例コーディング規約で禁止または非推奨とされている[6][7]。
また、PHPでは__construct
、Rubyではinitialize
というように、特定の名前を持つメソッドを作ればそれがコンストラクタになる、というプログラミング言語も存在する。
コンストラクタに渡す引数により初期化のバリエーションが定義される。特にパターンとして名前をもつコンストラクタは以下である。
- デフォルトコンストラクタ
- 引数なしで呼び出すことができるコンストラクタのことである。通常は引数のないコンストラクタであるが、C++ では全ての引数にデフォルト引数が指定されているコンストラクタも引数なしで呼び出すことが可能なためデフォルトコンストラクタと呼ばれる。
- コピーコンストラクタ
- 同一クラスのオブジェクトを基に、同一内容のオブジェクトを作成するコンストラクタ。複製を作る。ムーブコンストラクタと異なり、コピー元のオブジェクトが書き換えられることはない。
- ムーブコンストラクタ
- 同一クラスのオブジェクトを基に、同一内容のオブジェクトを作成するコンストラクタ。コンストラクタ内では、内部状態をムーブ元のオブジェクトから自身のオブジェクトに移動する。すなわち、ムーブ元のオブジェクトの内容は破壊される(ムーブコンストラクタ実行前と異なる状態となる)。C++11で正式に導入された[8]。
- 変換コンストラクタ
- 別の型からの暗黙変換を提供するコンストラクタ。C++において、
explicit
指定されておらず、1つだけ引数を受け取るコンストラクタは変換コンストラクタ (converting constructor) になり、明示的なコンストラクタ呼び出しの記述を省略できる[9]。2つ以上の引数を受け取り、2つ目以降にデフォルト引数が指定されているコンストラクタも対象になる。
- コンストラクタチェーン
- 引数の異なる複数のコンストラクタをチェーンのように一つのコンストラクタへ結び付けること。単純なものから複雑なものへ流すことで初期化コードの重複を防ぐ。C++11では委譲コンストラクタが言語機能として実装された。
JavaScriptのコンストラクタ
JavaScriptはプロトタイプベースのオブジェクト指向言語であるため、クラスは存在せず、new演算子付きで通常の関数を呼び出すことで、コンストラクタとして動作させる[10]。コンストラクタとして呼び出された関数では、this
は新しく生成されるオブジェクトを指すようになり[10]、また prototype プロパティも設定される[11]。
なお、ECMAScript 2015 (ES6) 以降はキーワード class
をサポートし、class
の関数プロパティ constructor
としてコンストラクタを定義し new
演算子に渡される式で暗黙に呼び出される[12]。
脚注
注釈
- ^ JIS X 3015「プログラム言語C#」では、instance constructorをインスタンス構築子、static constructorを静的構築子、default constructorを省略時構築子と訳している。JIS X 3060「ECMAScript言語」では構築子という訳語が使われている。
- ^ JIS X 3014「プログラム言語C++」を参照。
出典
参考文献
関連項目