デフォルトのコンストラクタ

フリー百科事典ウィキペディアより
ナビゲーションにジャンプ 検索にジャンプ

コンピュータープログラミング言語では、既定のコンストラクターという用語は、プログラマー定義のコンストラクターがない場合 (Java など) にコンパイラーによって自動的に生成されるコンストラクターを指す場合があり、通常はnullary コンストラクターです。他の言語 (C++ など) では、コンストラクターが自動生成かユーザー定義かに関係なく、引数を指定せずに呼び出すことができるコンストラクターです。コンストラクターの定義で 既定の引数が指定されている場合は、仮パラメーターを持つコンストラクターを引数なしで呼び出すことができることに注意してください。

C++

C++では、標準は、クラスの既定のコンストラクターを、引数なしで呼び出すことができるコンストラクターとして説明しています (これには、すべてのパラメーターが既定の引数を持つコンストラクターが含まれます) [1]例:

クラスMyClass 
{
公開:
    マイクラス(); // コンストラクタ宣言  

プライベート:
    int x ; 
};

MyClass :: MyClass () : x ( 100 ) // コンストラクター定義{    

}

intメイン() 
{
    MyClass m ; // 実行時にオブジェクト m が作成され、デフォルトのコンストラクタが呼び出されます}   

メモリを動的に割り当てる場合、クラス名の後に括弧を追加してコンストラクタを呼び出すことができます。ある意味で、これはコンストラクターへの明示的な呼び出しです。

intメイン() 
{
    MyClass *ポインタ=新しいMyClass (); // 実行時にオブジェクトが作成され、// デフォルトのコンストラクターが呼び出されます}       
                                        

コンストラクターに 1 つ以上のパラメーターがあり、それらすべてに既定値がある場合、それは既定のコンストラクターのままです。各クラスには、パラメーターを持たないコンストラクター、またはすべてのパラメーターがデフォルト値を持つコンストラクターのいずれかを最大 1 つ持つことができることに注意してください。

クラスMyClass 
{
公開:
    MyClass ( int i = 0 , std :: string s = "" ); // コンストラクタ宣言          

プライベート:
    int x ; 
    int y ; 
    std ::文字列z ; 
};

MyClass :: MyClass ( int i , std :: string s ) // コンストラクター定義{        

    x = 100 ;  
    y =;  
    z = s ;  
}

C++ では、既定のコンストラクターは特定の状況で自動的に呼び出されるため、重要です。したがって、これらの状況では、クラスがデフォルトのコンストラクターを持たないことはエラーになります。

  • オブジェクト値が引数リストなしで宣言された場合 (例: MyClass x;)、または引数リストなしで動的に割り当てられた場合 (例:new MyClass;またはnew MyClass();)、オブジェクトの初期化に のデフォルト コンストラクタMyClassが使用されます。
  • オブジェクトの配列が宣言されている場合MyClass x[10];または動的に割り当てられますnew MyClass [10]のデフォルト コンストラクターは、MyClassすべての要素を初期化するために使用されます。
  • 派生クラス コンストラクターがその初期化子リストで基底クラス コンストラクターを明示的に呼び出さない場合、基底クラスの既定のコンストラクターが呼び出されます。
  • クラス コンストラクターが、初期化子リスト内のオブジェクト値フィールドのいずれかのコンストラクターを明示的に呼び出さない場合、フィールドのクラスの既定のコンストラクターが呼び出されます。
  • 標準ライブラリでは、特定のコンテナーは、値が明示的に指定されていない場合、既定のコンストラクターを使用して値を "入力" します。たとえばvector<MyClass>(10);、デフォルトで構築されたオブジェクトで満たされた 10 個の要素でベクトルを初期化しMyClassます。

クラスに明示的に定義されたコンストラクターがない場合、コンパイラーはそのクラスのデフォルトのコンストラクターを暗黙的に宣言および定義します。この暗黙的に定義されたデフォルト コンストラクターは、本体が空の明示的に定義されたコンストラクターと同等です。例: [2]

クラスMyClass 
{
    int x ; // コンストラクターがないため、コンパイラーは (暗黙の) デフォルトのコンストラクターを生成します};   


intメイン() 
{
    MyClass m ; // 実行時にエラーなし: (暗黙の) デフォルト コンストラクタが呼び出されます}    

コンストラクターがクラスに対して明示的に定義されているが、それらがすべて既定値ではない場合、コンパイラーは暗黙的に既定のコンストラクターを定義しないため、クラスに既定のコンストラクターがない状況が発生します。これが、次の例で示される典型的なエラーの理由です。

クラスMyClass 
{
公開:
    MyClass ( int y ); // デフォルト以外のコンストラクタの宣言    

プライベート:
    int x ; 
};

MyClass :: MyClass ( int y )  
{
    x = y ;  
}

intメイン() 
{
    マイクラスm ( 100 ); // デフォルト以外のコンストラクターはMyClass * pと呼ばれます。// ポインター宣言の場合、コンパイラーはコンストラクターについて知る必要はありませんp = new MyClass (); // コンパイル時のエラー: デフォルトのコンストラクターがありませんreturn 0 ;      
              
         
     
}

プログラマーもコンパイラーもデフォルトのコンストラクターを定義していないため、 が指すオブジェクトを作成pするとエラーが発生します。[3]

一方、C++11 では、デフォルトのコンストラクターを明示的に作成できます。

クラスMyClass 
{
公開:
    MyClass () =デフォルト; // デフォルトのコンストラクターの生成を強制します};     

または明示的に禁止:

クラスMyClass 
{
公開:
    MyClass () =削除; // デフォルトのコンストラクタの生成を防ぎます};     

Java と C#

JavaC#の両方で、「デフォルト コンストラクター」とは、クラスにコンストラクターが定義されていない場合にコンパイラーによって自動的に生成されるnullary コンストラクターを指します。デフォルトのコンストラクターは、スーパークラスの nullary コンストラクターを暗黙的に呼び出してから、空の本体を実行します。すべてのフィールドは、初期値の 0 (整数型)、0.0 (浮動小数点型)、false(boolean型)、またはnull(参照型) のままです。パラメーターを取らないプログラマー定義のコンストラクターは、C#では既定のコンストラクターとも呼ばれますが、 Java では呼び出されません[4] [5]

参考文献

  1. ^ C++ 標準、ISO/IEC 14882:1998、12.1.5
    C++ 標準、ISO/IEC 14882:2003、12.1.5
  2. ^ Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg
  3. ^ Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg
  4. ^ Java 言語仕様、第 3 版、セクション 8.8.9、「デフォルト コンストラクター」。
  5. ^ コンストラクターの使用 (C# プログラミング ガイド)