コンストラクタ(構築子)
オブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行う関数あるいはメソッド
対義語 : デストラクタ
オブジェクト生成
オブジェクト生成は
- メモリ割り当て
- 初期化
の2段階を経て行われる
コンストラクタを持つプログラミング言語では、メモリ割り当ては言語機能に組み込まれ、初期化用のコードのみを記述するのが普通
クラスベース言語でのコンストラクタ
C#, Java, C++, PHPなどのクラスベースのオブジェクト指向言語ではクラスのメンバ変数として定義される
C++、Java、C#のコンストラクタはクラス名と同一の名前を持ち、戻り値指定のない関数(メソッド)のような記述になる
しかし、実際にそうというわけではない
PHPやRubyのように特定の名前を持つメソッドを作ればそれがコンストラクタになるという言語も存在する
コンストラクタに渡す引数により 初期化のバリエーションが定義される
パターンとして名前を持つコンストラクタ
デフォルトコンストラクタ
引数なしで呼び出すことができるコンストラクタ
通常は引数のないコンストラクタのことをさすが、C++では全ての引数にデフォルト引数が指定されているコンストラクタも引数なしで呼び出すことが可能なので、デフォルト引数と呼ばれる
コピーコンストラクタ
同一クラスのオブジェクトをもとに同一内容のオブジェクトを作成するコンストラクタ
複製を作る
ムーブコンストラクタと異なり、コピー元のオブジェクトが書き換えられることはない
ムーブコンストラクタ
同一クラスのオブジェクトをもとに同一内容のオブジェクトを作成するコンストラクタ
コンストラクタ内では、ムーブ元のオブジェクトの内部状態を自身のオブジェクトに移動する
ムーブ元のオブジェクトは破壊される(ムーブコンストラクタ実行前と異なる状態になる)
C++11から正式に導入された
コンストラクタチェーン
引数の異なる複数のコンストラクタを、チェーンのように一つのコンストラクタに結びつけること
単純なものから複雑なものへ処理を流すことで、初期化コードの重複を防ぐ
C++11では委譲コンストラクタが言語機能として導入された
JavaScriptのコンストラクタ
JSはプロトタイプベースのオブジェクト指向言語であるため、クラスは存在せず、new演算子つきで通常の関数を呼び出すことで、コンストラクタとして動作させることができる
関数をコンストラクタとして呼び出すと、thisは新しく生成されるオブジェクトを指すようになり、また、プロトタイプも設定される
ECMA Script2015以降は糖衣構文としてクラスもサポートする