2

Javaから来たので、以下のコードに問題があります。私の理解では、 b は3行目で宣言されているだけで、インスタンス化されていません。

クラスAでBのインスタンスを作成する教科書の方法は何ですか?

class A {
  private:
    B b;
  public:
    A() { 
      //instantiate b here?
    }
};

編集: B にデフォルトのコンストラクターがない場合はどうなりますか?

4

4 に答える 4

9

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.
  }
};
于 2012-07-24T13:04:11.163 に答える
0

お探しの正しいフェーズは「C++ 初期化リスト」です。この初期化リストは、コンストラクターが呼び出される前に呼び出されて初期化されます

デフォルトのコンストラクターの場合、コンパイラーの同等のコンストラクターはA() : B() {}

非常に良いリファレンス http://www.cprogramming.com/tutorial/initialization-lists-c++.html

于 2012-07-24T13:22:16.977 に答える
0

3 行目では、単純に B を宣言しています。

A a;

また

A a();

これにより、A のコンストラクターが呼び出されます。内部の b プライベート メンバーは、初期化されていない場合と同様に、フルまたはガベージです。可能であれば、構築中にメンバー変数を初期化することができ、おそらく初期化する必要があるという点で、あなたは正しいです。これを行うには、次の 2 つの方法があります。

A () 
{
   b = B ();
}

あなたが言ったように:

また

A () : b (B())
{
}

2 番目のバージョン (初期化リスト) は、新しい B オブジェクトを b 内に直接作成するため、わずかに効率的です。最初のバージョンは一時的なものを作成し、それを b に移動します。これは、渡されたパラメーターからメンバーを初期化する場合です (非組み込み型の場合)。この場合も同じだと思いますが、誰かが明確にすることができます。

于 2012-07-24T13:22:22.667 に答える
0

3 行目で のインスタンスを作成しましたb 。この行だけで、B のコンストラクターが呼び出されます。このようなコードがある場合

class A {
  private:
    B *b;
  public:
    A() { 
      //instantiate b here?
    }
};

次に、次のようbA'sコンストラクターでインスタンス化することは理にかなっています

A()
 { 
    b = new B();
 }
于 2012-07-24T13:05:20.573 に答える