コンストラクタ

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

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

オブジェクトの生成は、

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

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


クラスベース言語での構築子[編集]

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

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

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

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

なお、構築子について「クラス名と同一の名前を持つ関数(メソッド)」と説明している場合がある[要出典]が、C++やJavaでは厳密にいえばこれは誤りであり、構築子には名前はない。C++では「クラス名と同一の名前を持つメンバー関数」を定義することはできない。一方、Javaでは「クラス名と同一の名前を持つメソッド」を、構築子とは別に定義可能であるが、これは混乱を招くだけでなく、「クラス名を大文字で始め、メソッド名を小文字で始める」というJava公式の慣習に反することにもなるため、通例コーディング規約で禁止または非推奨とされている[4][5]

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

構築子に渡す引数により初期化の変種が定義される。特に頻出し,名前を持っている構築子を以下に示す。

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

JavaScriptの構築子[編集]

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

なお、ECMAScript 2015 (ES6) 以降は糖衣構文としてクラスもサポートする。

脚注[編集]

[脚注の使い方]

注釈[編集]

  1. ^ JIS X 3015「プログラム言語C#」[2]では、instance constructorをインスタンス構築子、static constructorを静的構築子、default constructorを省略時構築子と訳している。JIS X 3060「ECMAScript言語」[3]では構築子という訳語が使われている。

出典[編集]

  1. ^ JISX3014 2003.
  2. ^ JISX3015 2008.
  3. ^ JISX3060 2000.
  4. ^ Javaコーディング規約 | Future Enterprise Coding Standards
  5. ^ Java: Non-constructor methods should not have the same name as the enclosing class
  6. ^ Mayers, Scott「3章 現代のC++への移行 項目17:自動的に生成される特殊メンバ関数を理解する」『Effective Modern C++』千住治郎、オーム社、2015年9月16日、107頁。ISBN 978-4-87311-736-2。「C++11から、ムーブコンストラクタとムーブ代入演算子の2つが追加されました。」
  7. ^ a b 山田祥寛 (2007年9月25日). “連載:Ajax時代のJavaScriptプログラミング再入門 第4回 JavaScriptでオブジェクト指向プログラミング Page1”. @IT. 2011年12月13日閲覧。
  8. ^ 山田祥寛 (2007年9月25日). “連載:Ajax時代のJavaScriptプログラミング再入門 第4回 JavaScriptでオブジェクト指向プログラミング Page2”. @IT. 2011年12月13日閲覧。

参考文献[編集]

関連項目[編集]