2

私は次の声明と混同しています。

仕様から:

クラスの暗黙的に宣言された既定のコンストラクターが暗黙的に定義される前に、その基底クラスとその非静的データ メンバーのすべての暗黙的に宣言された既定のコンストラクターが暗黙的に定義されている必要があります。

私が理解しているのは:

暗黙的に宣言されたデフォルト コンストラクターは、オブジェクトの作成時に暗黙的に定義されます。

上記のステートメントはどういう意味ですか?. 基本クラスに明示的なデフォルト コンストラクターが含まれている場合、派生クラスは暗黙的なデフォルト コンストラクターを持つことはできませんか? 誰かがサンプルコードを提供してくれたらうれしいです。

4

2 に答える 2

4

このステートメントは、コンパイラーが暗黙的に宣言されたデフォルトコンストラクターの定義を提供する必要がある場合 (つまり、そのようなコンストラクターがodr-used である場合)、現在のコンストラクターの定義の前に、コンパイラーはすべてのメンバーがデフォルトで構築できることを確認する必要があることを意味します。メンバーの暗黙的に宣言された既定のコンストラクターを暗黙的に定義する必要がある場合があります。

例:

struct A { int x; };    
struct B { A a; };      // [1]
int main() {
   B b;                 // [2]
}

b[2]の変数の定義は、の暗黙的に宣言されたコンストラクターのODR 使用ですが、[1] で宣言された型のメンバーがあるためB、コンパイラーが を暗黙的に定義する前に、を暗黙的に定義する必要があります。その理由は、初期化リストでodr-useを使用することです。B::B()AA::A()B::B() A::A()

于 2012-07-20T13:02:29.027 に答える
2

クラスBaseand Derived(ベースから派生したもの) があるとします。

それらの両方が暗黙的に宣言されたデフォルトのコンストラクターを持っているとしましょう。Derivedクラスのオブジェクトを作成すると、次のようになります。最初に、暗黙的に宣言されたBaseクラスのデフォルト コンストラクターが定義されます。その後Derivedクラスの暗黙的に宣言されたコンストラクターでも同じことが起こります。

Derivedクラスのオブジェクトを作成すると、クラスのコンストラクターBaseが最初に呼び出されるため、これは完全に理にかなっています。その時までに確定しなければ、まあ、何か悪いことが起こるだろう。

同じことが、そのようなコンストラクターを持つすべてのクラス メンバーに適用されます。それらは、クラス自体のコンストラクターが定義される前に定義されます。

于 2012-07-20T13:00:56.500 に答える