コンストラクタ
コンストラクタ
コンストラクタ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/07 07:40 UTC 版)
ナビゲーションに移動 検索に移動コンストラクタ(英: constructor)は、オブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行なう関数あるいはメソッドのことである。対義語はデストラクタ。
オブジェクトの生成は、
の二段階を経て行なわれるが、コンストラクタを持つプログラミング言語ではメモリ割り当ては言語機能に組み込まれ、初期化用のコードのみを記述するのが普通である。
JISでは、「構築子」という直訳が割り当てられている規格もあるが[注釈 1]、「コンストラクタ」という用語が使われている規格もある[注釈 2]。
長音符を付けた「コンストラクター」という表記を採用しているドキュメントもある[4][5]。
クラスベース言語でのコンストラクタ
C++、Java、C#、PHPなど、クラスベースのオブジェクト指向言語では、コンストラクタはクラスのメンバとして定義される。
C++、Java、C#のコンストラクタは、「クラス名と同一の名前を持ち、戻り値指定のない関数(メソッド)」であるかのような記法となっている。以下にJavaの例を示す。
class SomeClass {
SomeClass(/*引数リスト*/) {
// 初期化用のコード
}
}
SomeClass obj = new SomeClass(/*引数リスト*/);
なお、コンストラクタについて「クラス名と同一の名前を持つ関数(メソッド)」と説明している場合がある[要出典]が、C++やJavaでは厳密にいえばこれは誤りであり、コンストラクタには名前はない。C++では「クラス名と同一の名前を持つメンバー関数」を定義することはできない。一方、Javaでは「クラス名と同一の名前を持つメソッド」を、コンストラクタとは別に定義可能であるが、これは混乱を招くだけでなく、「クラス名を大文字で始め、メソッド名を小文字で始める」というJava公式の慣習に反することにもなるため、通例コーディング規約で禁止または非推奨とされている[6][7]。
また、PHPでは__construct
、Rubyでは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]。
脚注
注釈
出典
- ^ JISX3015 2008.
- ^ JISX3060 2000.
- ^ JISX3014 2003.
- ^ コンストラクター - C# プログラミング ガイド | Microsoft Docs
- ^ コンストラクターとデストラクターの概要 (C++ のみ) - IBM Documentation
- ^ Javaコーディング規約 | Future Enterprise Coding Standards
- ^ Java: Non-constructor methods should not have the same name as the enclosing class
- ^ Mayers, Scott「3章 現代のC++への移行 項目17:自動的に生成される特殊メンバ関数を理解する」『Effective Modern C++』千住治郎、オーム社、2015年9月16日、107頁。ISBN 978-4-87311-736-2。「C++11から、ムーブコンストラクタとムーブ代入演算子の2つが追加されました。」
- ^ Converting constructor - cppreference.com
- ^ a b 山田祥寛 (2007年9月25日). “連載:Ajax時代のJavaScriptプログラミング再入門 第4回 JavaScriptでオブジェクト指向プログラミング Page1”. @IT. 2011年12月13日閲覧。
- ^ 山田祥寛 (2007年9月25日). “連載:Ajax時代のJavaScriptプログラミング再入門 第4回 JavaScriptでオブジェクト指向プログラミング Page2”. @IT. 2011年12月13日閲覧。
- ^ "Jordan Harband" (2021年6月24日). “"ECMA-262::15.7 Class Definitions"”. ECMAインターナショナル. 2021年7月1日閲覧。
参考文献
- JIS X 3014:2003「プログラム言語C++」(日本産業標準調査会、経済産業省)
- JIS X 3015:2008「プログラム言語C#」(日本産業標準調査会、経済産業省)
- JIS X 3060:2000「ECMAScript言語」(日本産業標準調査会、経済産業省)
関連項目
コンストラクタ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/05/08 02:09 UTC 版)
コンストラクタはオブジェクトが割り当てられた後すぐに呼び出され、オブジェクトの初期処理を行う。コンストラクタは典型的にはnewキーワードを使用して呼び出されるが、リフレクションを使用して呼ぶこともできる。リフレクション機能はjava.lang.reflectパッケージより提供される。 コンストラクタを宣言する際に使える修飾子はアクセス修飾子のみである。 可能ならば、オブジェクトはひとたびコンストラクタを呼ばれた以後は直ちに有効かつ有意味なオブジェクトとなるべきである。分割された複数の初期化用メソッドを使わなければ初期処理が完了しないというような設計は好ましくない。 慣習として、引数としてそのオブジェクト自身の型を受け取ってデータメンバを複写するようなコンストラクタを「コピーコンストラクタ」と呼ぶ。 コンストラクタが明示的に定義されていない場合、コンパイラは暗黙のうちに内容が空で引数を取らないデフォルトのコンストラクタを生成する。 コンストラクタはオーバーロードできる。 コンストラクタ内の最初の文は親クラスのコンストラクタ:super(...);または同じクラス内の別のコンストラクタ:this(...);を呼び出せる。 もし、super(...) または this(...)に対する明示的な呼び出しがないならば、コンストラクタ本体が実行される前に、親クラスのデフォルトコンストラクタsuper();が呼ばれる。
※この「コンストラクタ」の解説は、「Javaの文法」の解説の一部です。
「コンストラクタ」を含む「Javaの文法」の記事については、「Javaの文法」の概要を参照ください。
コンストラクタ
出典:『Wiktionary』 (2021/08/11 11:40 UTC 版)
発音(?)
語源
- 英語: constructor
名詞
- こんすとらくた
関連語
- デフォルトコンストラクタ、コピーコンストラクタ
- コンストラクタのオーバーロード
固有名詞の分類
- コンストラクタのページへのリンク