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

引数のないコンストラクター、またはすべての引数にデフォルト値を持つコンストラクターは、 デフォルトのコンストラクター

パラメーター リストがゼロのコンストラクター、または別の意味で引数を受け入れないコンストラクターは、引数ゼロ コンストラクターまたはデフォルト コンストラクターと呼ばれます。

デフォルトのコンストラクターがプログラマによってソース コードで定義されていない場合、コンパイラはコンパイル中にデフォルトのコンストラクターを暗黙的に定義します。

デフォルトのコンストラクターがプログラマーによってプログラム内で明示的に定義されている場合、コンパイラーはコンストラクターを暗黙的に定義せず、暗黙的にコンストラクターを呼び出します。

デフォルトのコンストラクターにはどのような意味があるのでしょうか?

これらは、特定の初期値を持たないオブジェクトを作成するために使用されます。

デフォルトのコンストラクターは自動的に提供されますか?

クラス内でコンストラクターが明示的に宣言されていない場合は、コンパイラーによってデフォルトのコンストラクターが自動的に提供されます。

デフォルトのコンストラクターにデフォルトの引数を含めることはできますか?

はい、コンストラクターには、オブジェクトのデフォルト値を持つデフォルト引数を含めることができます。

ユーザーが実装したデフォルトのコンストラクターにコンパイラーによってバックグラウンドでコードが挿入されることはありますか?

プログラマによって提供されない場合、コンパイラはデフォルトのコンストラクタを暗黙的に宣言し、必要に応じてそれを定義します。コンパイラ定義のデフォルト コンストラクターは、クラス内部の特定の初期化を行うために必要です。データ メンバーや単純な古いデータ型 (配列、構造体などの集合体) には触れません。ただし、コンパイラは状況に応じてデフォルトのコンストラクターのコードを生成します。

デフォルトのコンストラクターを持つ別のクラスから派生したクラス、またはデフォルトのコンストラクターを持つ別のクラス オブジェクトを含むクラスを考えてみましょう。コンパイラーは、基本クラス/埋め込みオブジェクトのデフォルトのコンストラクターを呼び出すコードを挿入する必要があります。

C++




// CPP program to demonstrate Default constructors> #include> using> namespace> std;> class> Base {> public> :> > // compiler 'declares' constructor> };> class> A {> public> :> > // User defined constructor> > A() { cout < <> 'A Constructor'> < < endl; }> > // uninitialized> > int> size;> };> class> B :> public> A {> > // compiler defines default constructor of B, and> > // inserts stub to call A constructor> > // compiler won't initialize any data of A> };> class> C :> public> A {> public> :> > C()> > {> > // User defined default constructor of C> > // Compiler inserts stub to call A's constructor> > cout < <> 'C Constructor'> < < endl;> > // compiler won't initialize any data of A> > }> };> class> D {> public> :> > D()> > {> > // User defined default constructor of D> > // a - constructor to be called, compiler inserts> > // stub to call A constructor> > cout < <> 'D Constructor'> < < endl;> > // compiler won't initialize any data of 'a'> > }> private> :> > A a;> };> // Driver Code> int> main()> {> > Base base;> > B b;> > C c;> > D d;> > return> 0;> }>

出力

A Constructor A Constructor C Constructor A Constructor D Constructor 

C++




Example:> #include> using> namespace> std;> class> student> {> > int> rno;> > char> name[50];> > double> fee;> > public> :> > student()> // Explicit Default constructor> > {> > cout < <> 'Enter the RollNo:'> ;> > cin>>rno;>> > cout < <> 'Enter the Name:'> ;> > cin>>名前;>> ;> > cin>>料金;>>'

言語要件に従って必要な初期化を確実に行うために、コンパイラーがコードを挿入する必要があるさまざまなシナリオがあります。今後の投稿で紹介する予定です。私たちの目的は、C++ の内部構造を認識することであり、C++ の内部構造を誤って使用しないことです。

C++




// CPP code to demonstrate constructor can have default> // arguments> #include> using> namespace> std;> class> A {> public> :> > int> sum = 0;> > A();> // default constructor with no argument> > A(> int> a,> int> x = 0)> // default constructor with one> > // default argument> > {> > sum = a + x;> > }> > void> print() { cout < <> 'Sum ='> < < sum < < endl; }> };> int> main()> {> > // This construct has two arguments. Second argument is> > // initialized with a value of 0 Now we can call the> > // constructor in two possible ways.> > A obj1(10, 20);> > A obj2(5);> > obj1.print();> > obj2.print();> > return> 0;> }>

出力

Sum =30 Sum =5 

説明 : ここでは、単純なパラメーターと 1 つのデフォルト パラメーターという 2 つのパラメーターを持つコンストラクターがあります。このコンストラクターを呼び出すには 2 つの方法があります。

  1. まず、両方の引数に値を割り当てることができ、これらの値はコンストラクターに渡され、値 0 を持つデフォルトの引数 x は、呼び出し中に渡された値 (この場合は 20) によってオーバーライドされます。したがって、コードの出力は 30 になります (sum= a+x、つまり 10+20= 30)。
  2. 2 番目の方法は、デフォルト パラメータに値を渡さないことです。そうすると、x はデフォルト値 0 を最終値として取り、合計 5 を計算します (sum = a+x、つまり 5+0=5)。