Javaから来たので、以下のコードに問題があります。私の理解では、 b は3行目で宣言されているだけで、インスタンス化されていません。
クラスAでBのインスタンスを作成する教科書の方法は何ですか?
class A {
private:
B b;
public:
A() {
//instantiate b here?
}
};
編集: B にデフォルトのコンストラクターがない場合はどうなりますか?
b
のコンストラクターの初期化リストで明示的に初期化できますA
。たとえば、
class A {
B b; // private
public:
A : b() {} // the compiler provides the equivalent of this if you don't
};
ただし、b
とにかく自動的にインスタンス化されます。上記は、B
デフォルト以外のコンストラクターでビルドする必要がある場合、またはB
デフォルトで初期化できない場合に意味があります。
class A {
B b; // private
public:
A : b(someParam) {}
};
コンストラクターの初期化リストで正しく初期化できない場合があります。その場合、コンストラクターの本体で代入を行うことができます。
class A {
B b; // private
public:
A {
b = somethingComplicated...; // assigns new value to default constructed B.
}
};
お探しの正しいフェーズは「C++ 初期化リスト」です。この初期化リストは、コンストラクターが呼び出される前に呼び出されて初期化されます
デフォルトのコンストラクターの場合、コンパイラーの同等のコンストラクターはA() : B() {}
非常に良いリファレンス http://www.cprogramming.com/tutorial/initialization-lists-c++.html
3 行目では、単純に B を宣言しています。
A a;
また
A a();
これにより、A のコンストラクターが呼び出されます。内部の b プライベート メンバーは、初期化されていない場合と同様に、フルまたはガベージです。可能であれば、構築中にメンバー変数を初期化することができ、おそらく初期化する必要があるという点で、あなたは正しいです。これを行うには、次の 2 つの方法があります。
A ()
{
b = B ();
}
あなたが言ったように:
また
A () : b (B())
{
}
2 番目のバージョン (初期化リスト) は、新しい B オブジェクトを b 内に直接作成するため、わずかに効率的です。最初のバージョンは一時的なものを作成し、それを b に移動します。これは、渡されたパラメーターからメンバーを初期化する場合です (非組み込み型の場合)。この場合も同じだと思いますが、誰かが明確にすることができます。
3 行目で のインスタンスを作成しましたb
。この行だけで、B のコンストラクターが呼び出されます。このようなコードがある場合
class A {
private:
B *b;
public:
A() {
//instantiate b here?
}
};
次に、次のようb
にA's
コンストラクターでインスタンス化することは理にかなっています
A()
{
b = new B();
}