がパラメーターのないコンストラクターであると言う場合default constructor
、コンパイラーによって作成されたコンストラクターも であると言えdefault constructor
ますか?
ありがとう。
がパラメーターのないコンストラクターであると言う場合default constructor
、コンパイラーによって作成されたコンストラクターも であると言えdefault constructor
ますか?
ありがとう。
デフォルトのコンストラクターは、引数なしで呼び出すことができるコンストラクターです。
C++98 §12.1/5 :
クラスのデフォルトコンストラクターは、引数なしで呼び出すことができる
X
コンストラクターです。class に対してユーザー宣言X
のコンストラクターがない場合、デフォルトのコンストラクターが暗黙的に宣言されます。X
デフォルトのコンストラクターは、引数なしで呼び出すことができるコンストラクターです。したがって、これは引数を持たないコンストラクターか、引数がすべてデフォルト値を持つコンストラクターのいずれかです。
しかし、はい、他のコンストラクターを提供しない場合、コンパイラーはデフォルトのコンストラクターを生成します。
推奨される読書: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.4 .
+------> Implicitly GENERATED by compiler
|
|
Default Constructor -----+
|
|
+------> Explicitly provided by programmer
基本的に、デフォルトのctorは引数のないctorです。
次の場合、コンパイラはデフォルトのctorを生成しないことに注意してください。
class WontGenerateDefCtoByCompiler
{
private:
char* iHaHaPtr;
};
コンパイラーである理由は、プログラマーが提供するポインターを初期化する必要性を認識していません。デフォルトのctorを正しく記述して初期化するのは、プログラマーの責任です。
一方、上記のクラス内に仮想関数を記述した場合、コンパイラーは確実にデフォルトのctorを生成します(ただし、iHahaptrポインターは初期化されません)。さらに、そのようなctorは、そのオブジェクトのインスタンスがプログラムで作成された場合にのみ生成されます(そうでない場合も、コンパイラーによってctorは生成されません)。
これらは、コンパイラーがデフォルトのctorを暗黙的に生成する唯一の4つの条件です(プログラマーによって提供されていない場合)。
(1) The class has a virtual function (Why? need to setup vptr correctly )
(2) The class is derived from another class that has default ctor (either implicitly generated or explictly provided)
(3) The class has a member that has default ctor (either implicitly generated or explictly provided)
(4) The class is virtually derived from other class
他のすべての場合、コンパイラーはデフォルトのctorを生成しません。
「コンパイラが作成したコンストラクタもデフォルトのコンストラクタ」とは言えません。コンストラクターが宣言されていない場合、コンパイラーはデフォルト コンストラクターとコピー コンストラクターを生成します (ここで C++0x について話している場合は、移動コンストラクターも生成される可能性があります)。「コンパイラによって作成されたコンストラクター」について言及する場合、実際には少なくとも 2 つのコンストラクターについて同時に話していることになります。したがって、「コンパイラによって作成されたデフォルトのコンストラクターもデフォルトのコンストラクターです」としか言えませんが、これはCapt. Obviousが言うことのように聞こえます。