コンストラクタとは
コンストラクタ(constructor)は、
オブジェクト指向プログラミング言語において、新しいオブジェクトが生成される際に自動的に呼び出される関数またはメソッドのことです。主な役割は、オブジェクトの初期化処理を行うことです。オブジェクトの生成は、通常、メモリの割り当てと初期化の2段階を経て行われますが、コンストラクタを持つ言語では、メモリ割り当ては言語機能に組み込まれており、初期化のためのコードのみを記述します。
JIS規格では「構築子」という訳語が当てられていることもありますが、一般的には「コンストラクタ」という用語が広く使われています。また、「コンストラクター」という表記も用いられることがあります。
クラスベース言語におけるコンストラクタ
C++、
Java、C#、PHPなどのクラスベースの
オブジェクト指向言語では、コンストラクタはクラスのメンバとして定義されます。
C++、
Java、C#では、コンストラクタは「クラス名と同じ名前を持ち、戻り値の指定がない関数(メソッド)」のように記述されます。ただし、厳密にはコンストラクタ自体には名前はなく、「クラス名と同じ名前のメンバ関数」という扱いになります。例えば
Javaでは、クラス名と同じ名前のメソッドを定義することもできますが、これは混乱を招くため、通常はコーディング規約で禁止されています。
PHPでは`__construct`、
Rubyでは`initialize`という特定の名前を持つメソッドがコンストラクタとして機能します。
コンストラクタは、
引数を受け取ることができ、その
引数によってオブジェクトの初期化のバリエーションを定義することができます。
コンストラクタの種類
以下に、代表的なコンストラクタの種類を説明します。
デフォルトコンストラクタ
引数なしで呼び出すことができるコンストラクタです。
C++では、全ての
引数にデフォルト値が指定されている場合もデフォルトコンストラクタとみなされます。
コピーコンストラクタ
同じクラスのオブジェクトを元に、内容が同じ新しいオブジェクトを作成するコンストラクタです。元のオブジェクトは変更されません。
ムーブコンストラクタ
同じクラスのオブジェクトを元に、内容が同じ新しいオブジェクトを作成するコンストラクタですが、元のオブジェクトの内容は移動され、破壊されます。
C++11で導入されました。
変換コンストラクタ
異なる型からの暗黙的な変換を行うコンストラクタです。
C++では、`explicit`指定がなく、
引数が1つのコンストラクタは変換コンストラクタとして扱われます。
コンストラクタチェーン
引数の異なる複数のコンストラクタを連鎖させて、初期化コードの重複を防ぐ手法です。
C++11では委譲コンストラクタとして実装されました。
JavaScriptのコンストラクタ
JavaScriptはプロトタイプベースの
オブジェクト指向言語であるため、クラスの概念がありません。しかし、`new`演算子と関数を組み合わせてコンストラクタとして機能させることができます。`new`演算子で呼び出された関数では、`this`は新しく生成されたオブジェクトを指し、`prototype`プロパティも設定されます。
ECMAScript 2015 (ES6)以降では、`class`キーワードがサポートされ、`constructor`プロパティとしてコンストラクタを定義できるようになりました。`new`演算子で呼び出される式で、コンストラクタは暗黙的に呼び出されます。
まとめ
コンストラクタは、
オブジェクト指向プログラミングにおいて非常に重要な役割を果たします。オブジェクトの初期化を効率的に行い、プログラムの安定性や保守性を向上させるために、コンストラクタの理解は不可欠です。
参考文献
JIS X 3014:2003「プログラム言語C++」
JIS X 3015:2008「プログラム言語C#」
JIS X 3060:2000「ECMAScript言語」
関連項目
デストラクタ