コンストラクタ

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

コンストラクタ(構築子、: Constructor)は、オブジェクト指向プログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行なう関数メソッドのことである。対義語はデストラクタ

オブジェクトの生成は、

  1. メモリ割当(: allocation
  2. 初期化(: initialization

の二段階を経て行われるが、コンストラクタを持つプログラミング言語ではメモリ割当は言語機能に組み込まれ、初期化用のコードのみを記述するのが普通である。

クラスベース言語でのコンストラクタ[編集]

JavaC++PHPなど、クラスベースのオブジェクト指向言語では、コンストラクタはクラスのメンバとして定義される。

Java, C++ではコンストラクタを「クラス名と同一の名前を持ち、戻り値指定のない関数(メソッド)」であるかのような記法となっている。以下に例を示す。

class SomeClass {
  SomeClass(/*引数リスト*/) {
    // 初期化用のコード
  }
}

SomeClass obj = new SomeClass(/*引数リスト*/);

なお、コンストラクタについて「クラス名と同一の名前を持つ関数(メソッド)」と説明している場合があるが、JavaやC++では厳密にいえばこれは誤りであり、コンストラクタには名前は無い。 「クラス名と同一の名前を持つ関数(メソッド)」は、C++では定義する事はできないが、Javaでは(コンストラクタとは別に)定義可能である(もちろんお勧めはできない)。

また、PHPでは__constructRubyではinitializeというように、特定の名前を持つメソッドを作ればそれがコンストラクタになる、というプログラミング言語も存在する。

コンストラクタに渡す引数により初期化のバリエーションが定義される。特にパターンとして名前をもつコンストラクタは以下である。

デフォルトコンストラクタ
引数なしで呼び出す事が出来るコンストラクタのことである。通常は引数のないコンストラクタであるが、C++ では全ての引数にデフォルト引数が指定されているコンストラクタも引数なしで呼び出す事が可能なためデフォルトコンストラクタと呼ばれる。
コピーコンストラクタ
同一クラスのオブジェクトを基に、同一内容のオブジェクトを作成するコンストラクタ。複製を作る。ムーブコンストラクタと異なり、コピー元のオブジェクトが書き換えられることはない。
ムーブコンストラクタ
同一クラスのオブジェクトを基に、同一内容のオブジェクトを作成するコンストラクタ。コンストラクタ内では、内部状態をムーブ元のオブジェクトから自身のオブジェクトに移動する。すなわち、ムーブ元のオブジェクトの内容は破壊される(ムーブコンストラクタ実行前と異なる状態となる)。C++11で正式に導入された[1]
コンストラクタチェーン
引数の異なる複数のコンストラクタをチェーンのように一つのコンストラクタへ結び付けること。単純なものから複雑なものへ流すことで初期化コードの重複を防ぐ。C++11では委譲コンストラクタが言語機能として実装された。

JavaScriptのコンストラクタ[編集]

JavaScriptプロトタイプベースのオブジェクト指向言語であるため、クラスは存在せず、new演算子付きで通常の関数を呼び出すことで、コンストラクタとして動作させることができる[2]。関数をコンストラクタとして呼び出すと、thisは新しく生成されるオブジェクトを指すようになり[2]、またプロトタイプも設定される[3]

脚注[編集]

[ヘルプ]
  1. ^ Mayers, Scott 「3章 現代のC++への移行 項目17:自動的に生成される特殊メンバ関数を理解する」『Effective Modern C++』 千住治郎、オーム社、2015年9月16日、107頁。ISBN 978-4-87311-736-2。「C++11から、ムーブコンストラクタとムーブ代入演算子の2つが追加されました。」
  2. ^ a b 山田祥寛 (2007年9月25日). “連載:Ajax時代のJavaScriptプログラミング再入門 第4回 JavaScriptでオブジェクト指向プログラミング Page1”. @IT. 2011年12月13日閲覧。
  3. ^ 山田祥寛 (2007年9月25日). “連載:Ajax時代のJavaScriptプログラミング再入門 第4回 JavaScriptでオブジェクト指向プログラミング Page2”. @IT. 2011年12月13日閲覧。