2

私は次のようなコードをいくつか見直してきました:

class A; // defined somewhere else, has both default constructor and A(int _int) defined
class B
{
public:
    B(); // empty
    A a;
};

int main()
{
     B* b;
     b = new B();
     b->a(myInt); // here, calling the A(int _int) constructor,
     //but default constructor should already have been called
}

これは機能しますか?デフォルトが既に呼び出された後に特定のコンストラクターを呼び出す?

4

4 に答える 4

15

そのコードは a のコンストラクターを呼び出しません。を呼び出しますA::operator()(int)

しかしすでに構築されているオブジェクトに対してコンストラクターを明示的に呼び出すと、未定義の動作領域に陥ります。実際には動作するように見えるかもしれませんが、期待どおりに動作するという保証はありません。

于 2009-05-06T14:40:20.907 に答える
2

クラスBで別のコンストラクターを作成できます

B(int _int):a(_int) {}

その場合、 b = new B(myInt); と書くと

上記のコードは、クラス A のコンストラクター コードを遅延させません。

b->a(myInt) を呼び出す必要はありません

于 2009-05-06T14:40:49.283 に答える
1

これはコンストラクターを呼び出していません。この回答は、何が起こっているかについての唯一の可能な説明をカバーしています。

既存のオブジェクトでコンストラクターを呼び出す唯一の標準的な方法は、placement new を使用することです (前のインスタンスが破棄された後)。

void foo (A * a) {
  a->~A ();           // Destroy previous instance
  new (a) A(myInt);   // Construct new object in same location
} 
于 2009-05-06T14:40:24.977 に答える
0

B() コンストラクター内から A(int) コンストラクターを呼び出すか、A(int) コンストラクターも呼び出す B(int) コンストラクターを作成する必要があります。

ベスト プラクティスは、A のデフォルトの int を設定するデフォルトのものと、A(int) を初期化する B(int) の両方を用意することです。

于 2009-05-06T14:46:31.860 に答える