1

だから私はC++のいくつかの厄介なことに巻き込まれています。具体的には、C++のクラスの初期化子リストで使用するために参照によって匿名変数を渡します。次のコードを検討してください。

class A {
public:
  int x;

  A(int x=0) : x(x) {
    std::cout <<"A: creatred\n";
  }

  ~A() {
    std::cout << "A: destroyed\n";
  }
};

class B {
public:
  A a;

  B(const A& in) : a(in) {
    std::cout <<"B: creatred\n";
  }

  ~B() {
    std::cout << "B: destroyed\n";
  }
};

int main() {
  B b(A(0));
  std::cout << "END\n";
  return 0;
}

出力:

A: creatred
B: creatred
A: destroyed
END
B: destroyed
A: destroyed

私は2つの創造物と3つの破壊を数えます。どうしたの?私の見方では、A(0)作成時に入力として匿名変数を使用していますb。今の順番がわからない。匿名変数への参照が作成され、メンバー変数をコピーするために使用されます(コピーコンストラクターは初期化子リストで呼び出されます、そうですか?)a。匿名変数はいつ破棄されますか?そして、一般的に、なぜ2つのコンストラクターと3つのデストラクタが表示されるのですか。ありがとう。

4

2 に答える 2

4

Aメッセージを出力するためにのコピーコンストラクタをオーバーライドしませんでした...

具体的には、それをa(in)呼び出します。

于 2013-01-16T02:53:06.840 に答える
3

欠落しているコンストラクターは、Aのコピーコンストラクターになります。

以下の行に構成Aをコピーします。

B(const A& in) : a(in)  

A: destroyed
END

これは一時的に破壊され、行の終わりで破壊されます

B b(A(0));
于 2013-01-16T02:53:11.740 に答える