コンピュータプログラミング言語において、デフォルトコンストラクタとは、プログラマが定義したコンストラクタが存在しない場合にコンパイラによって自動的に生成されるコンストラクタ(Javaなど)を指し、通常は空引数コンストラクタです。他の言語(C++など)では、自動生成コンストラクタかユーザー定義コンストラクタかに関わらず、引数を一切指定せずに呼び出すことができるコンストラクタを指します。仮引数を持つコンストラクタであっても、コンストラクタの定義時にデフォルト引数が指定されていれば、引数なしで呼び出すことができることに注意して ください。
C++
C++の標準では、クラスのデフォルトコンストラクタは引数なしで呼び出せるコンストラクタ(すべてのパラメータにデフォルト引数を持つコンストラクタも含む)と定義されています。[ 1 ]例えば:
クラスMyClass { private : int x ; public : // コンストラクターMyClass () : x { 100 } {} };int main () { MyClass m ; // 実行時にオブジェクト m が作成され、デフォルトコンストラクターが呼び出されます}メモリを動的に割り当てる場合、クラス名の後に括弧を追加することでコンストラクタを呼び出すことができます。これはある意味で、コンストラクタへの明示的な呼び出しです。
int main () { MyClass * p = new MyClass (); // 実行時にオブジェクトが作成され、デフォルトのコンストラクターが呼び出されますdelete p ; }コンストラクタが1つ以上のパラメータを持ち、それらすべてがデフォルト値を持つ場合も、それはデフォルトコンストラクタです。各クラスは最大1つのデフォルトコンストラクタを持つことができます。パラメータを持たないコンストラクタか、すべてのパラメータがデフォルト値を持つコンストラクタのいずれかです。例えば、次のようになります。
クラスMyClass { private : int x ; int y ; std :: string z ; public : // コンストラクターMyClass ( int i = 0 , const std :: string & s = "" ) : x { 100 }, y { i }, z { s } {} };C++ では、デフォルト コンストラクターは特定の状況で自動的に呼び出されるため重要です。したがって、次のような状況では、クラスにデフォルト コンストラクターがないとエラーになります。
- オブジェクト値が引数リストなしで宣言された場合 (例:
MyClass x;)、または引数リストなしで動的に割り当てられた場合 (例:new MyClass;または)、オブジェクトnew MyClass();の初期化には のデフォルト コンストラクターが使用されます。MyClass - オブジェクトの配列が宣言される場合(例:
MyClass x[10];)、または動的に割り当てられる場合(例:new MyClass [10])。 のデフォルトコンストラクタをMyClass使用してすべての要素が初期化されます。 - 派生クラスのコンストラクターが初期化リストで基本クラスのコンストラクターを明示的に呼び出さない場合は、基本クラスのデフォルト コンストラクターが呼び出されます。
- クラス コンストラクターが初期化リスト内のいずれかのオブジェクト値フィールドのコンストラクターを明示的に呼び出さない場合は、フィールドのクラスのデフォルト コンストラクターが呼び出されます。
- 標準ライブラリでは、特定のコンテナは、値が明示的に指定されていない場合、デフォルトコンストラクタを使用して値を「埋める」ことができます。例えば、
vector<MyClass>(10);ベクターを10個の要素で初期化し、デフォルトMyClassコンストラクタで生成されたオブジェクトを埋めます。
クラスに明示的に定義されたコンストラクタがない場合、コンパイラは暗黙的にデフォルトコンストラクタを宣言・定義します。この暗黙的に定義されたデフォルトコンストラクタは、明示的に定義された空のコンストラクタと同等です。例えば、次のようになります。[ 2 ]
class MyClass { int x ; // コンストラクターがないため、コンパイラは(暗黙的な)デフォルト コンストラクターを生成します};int main () { MyClass m ; // 実行時にエラーは発生しません: (暗黙の) デフォルトコンストラクタが呼び出されます}クラスに明示的にコンストラクタが定義されているものの、それらがすべてデフォルトコンストラクタでない場合、コンパイラは暗黙的にデフォルトコンストラクタを定義せず、クラスにデフォルトコンストラクタがない状態になります。これが、以下の例で示す典型的なエラーの原因です。
class MyClass { private : int x ; public : MyClass ( int y ) : x { y } {} // デフォルト以外のコンストラクターの宣言}; int main () { MyClass m ( 100 ); // デフォルト以外のコンストラクターはMyClass * pと呼ばれます。// ポインター宣言の場合、コンパイラーはコンストラクターについて知る必要はありません。p = new MyClass (); // コンパイル時にエラー: デフォルト コンストラクターがありません。delete p ; return 0 ; }プログラマもコンパイラもデフォルトコンストラクタを定義していないため、によって指されるオブジェクトの作成はpエラーを引き起こします。[ 3 ]
一方、C++11 では、デフォルト コンストラクターを明示的に作成できます。
class MyClass { public : MyClass () = default ; // デフォルトコンストラクターの生成を強制する};または明示的に禁止されています:
class MyClass { public : MyClass () = delete ; // デフォルトコンストラクターの生成を防ぐ};JavaとC#
JavaとC#の両方において、「デフォルトコンストラクタ」とは、クラスにコンストラクタが定義されていない場合にコンパイラによって自動的に生成される引数なしのコンストラクタを指します。デフォルトコンストラクタは、スーパークラスの引数なしのコンストラクタを暗黙的に呼び出し、空の本体を実行します。すべてのフィールドは、初期値である0(整数型)、0.0(浮動小数点型)、false(boolean型)、またはnull(参照型)のままです。プログラマが定義したパラメータを取らないコンストラクタも、C#ではデフォルトコンストラクタと呼ばれますが、Javaではそうではありません。[ 4 ] [ 5 ]
参照
参考文献
- ^ C++ 標準、ISO/IEC 14882:1998、12.1.5C++ 標準、ISO/IEC 14882:2003、12.1.5
- ^コンピュータサイエンス C++ を用いた構造化アプローチ、Behrouz A. Forouzan と Richard F. Gilberg 著
- ^コンピュータサイエンス C++ を用いた構造化アプローチ、Behrouz A. Forouzan と Richard F. Gilberg 著
- ^ Java言語仕様、第3版、セクション8.8.9、「デフォルトコンストラクタ」。
- ^コンストラクターの使用 (C# プログラミング ガイド)