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

オブジェクトの生成は、

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

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

JISでは、「構築子」という直訳が割り当てられている規格もあるが[注釈 1]、「コンストラクタ」という用語が使われている規格もある[注釈 2]

長音符を付けた「コンストラクター」という表記を採用しているドキュメントもある[4][5]

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

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

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

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

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

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

また、PHPでは__constructRubyでは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]

脚注 編集

注釈 編集

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

出典 編集

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

参考文献 編集

関連項目 編集