mixiユーザー(id:65780217)

2021年02月22日05:57

15 view

コンストラクタ

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

オブジェクトの生成は、

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

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

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

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

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

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

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

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

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

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

脚注
[脚注の使い方]
注釈
^ JIS X 3015「プログラム言語C#」では、instance constructorをインスタンス構築子、static constructorを静的構築子、default constructorを省略時構築子と訳している。JIS X 3060「ECMAScript言語」では構築子という訳語が使われている。
^ JIS X 3014「プログラム言語C++」を参照。
出典
^ JISX3015 2008.
^ JISX3060 2000.
^ JISX3014 2003.
^ 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つが追加されました。」
^ 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日閲覧。
参考文献
JIS X 3014:2003「プログラム言語C++」(日本産業標準調査会、経済産業省)
JIS X 3015:2008「プログラム言語C#」(日本産業標準調査会、経済産業省)
JIS X 3060:2000「ECMAScript言語」(日本産業標準調査会、経済産業省)
関連項目
デストラクタ
ウィクショナリーに関連の辞書項目があります。
コンストラクタ
執筆の途中です この項目は、ソフトウェアに関連した書きかけの項目です。この項目を加筆・訂正などしてくださる協力者を求めています(PJ:コンピュータ/P:コンピュータ)。
カテゴリ: プログラミング言語の構文オブジェクト指向
案内メニュー


0 0

コメント

mixiユーザー

ログインしてコメントを確認・投稿する