3

コードサンプルを考えると:

class B {
    //Some contents.
};

class C {
    private:
        B& b;
};

class A {
    private:
        B b;
        C c;
};

クラスCにはabへの参照があるため、それを使用して初期化する必要があります。クラスAには、BのインスタンスとCのインスタンスが含まれています。

私の質問は次のとおりです。AのCインスタンスをAのBインスタンスで初期化できますか(コンストラクターをわざわざ入れたと仮定して)?次に、AのBの明示的な初期化を実行する必要がありますか、それともクラス内のクラスタイプであるため、デフォルトで初期化されますか?

4

4 に答える 4

6

メンバー変数は、クラス宣言で宣言されている順序で初期化されます (コンストラクターの初期化リストで異なる順序でそれらを持っている場合でも)、はい、c初期化bされるまでに初期化されます。を使用bして初期化できますc

Ricardo Cardenes が指摘しているように、クラス定義でc前に宣言しても (つまり、初期化されていない への参照を渡すことを意味します)、それでも動作しますが、内部でオブジェクトを使用すると、未定義の動作が発生します。今はinsideを使用しないかもしれませんが、将来、参照が初期化されていない を参照していることを忘れて、UB を引き起こす可能性があるため、最初に宣言する方が安全です。bC::CBC::CbbC::CB

いいえ、デフォルトで構築したくない場合を除き、明示的に初期化する必要はありませんbPODでない限り)。したがって、このコードはあなたが望むものになります( BPODでない場合):

A::A() : c(b) { }
于 2012-01-10T19:03:06.090 に答える
3

最初の質問: 次のようなコンストラクターを記述して初期化できます。

C::C(B& bInst): b(bInst){}
A::A():b(), c(b) {}

もちろん、コンストラクターがC実際にb(アドレスだけでなく) を使用する場合は、初期化順序が同じであることを確認する必要があるため、メンバーは宣言された順序で初期化されるため、b前に宣言する必要があります(初期化clist はそれらを別の順序に並べます)。

B を明示的に初期化する必要はありません。そうしないとデフォルトで構築されるためです。もちろん、B が POD の場合、これは初期化されていないままであることを意味します (ただしb()、の初期化子リストを使用して明示的に初期化すると、 に初期A()化されます0)。

于 2012-01-10T19:03:11.357 に答える
0

A の C インスタンスを A の B インスタンスで初期化できますか (コンストラクターをわざわざ入れたと仮定して)

もちろん。

次に、A で B の明示的な初期化を実行する必要がありますか、それともクラス内のクラス型であるため、デフォルトで初期化されていますか?

いいえ、大丈夫です。

于 2012-01-10T19:04:22.727 に答える
0

はい、C には B への参照のみが含まれており、個別のインスタンスは含まれていないため、C にコンストラクターを配置して、ACb に AB を参照させることができます。

A のインスタンスを作成すると、A 内の B と C は両方とも自動的にインスタンス化/構築されます。

于 2012-01-10T19:02:35.217 に答える