0

次のピースコードを検討してください。

#include<iostream>

using namespace std;

class A
{
private:
  int *x;
public:
  A(int a)
  {
    cout<<"creating "<<a<<" "<<this<<endl;
    x = new int;
    *x = a;
  }

  A(A *a)
  {
    this->x = a->x;
  }

  ~A()
  {
    cout<<"destroying "<<x<<endl;
    delete x;
  }

  A *operator+(A a)
  {
    return new A(*x + *(a.x));
  }

  void display()
  {
    cout<<*x<<endl;
  }
};

int main()
{
  A a(5);
  A b(10);
  A c = a + b;

  cout<<"control returns to main"<<endl;
  a.display();
  b.display();
  c.display();
  return 0;
}

次の出力が生成されます。

creating 5 0xbffd6710
creating 10 0xbffd6714
creating 15 0x9273028
destroying 0x9273018
control returns to main
5
0
15
destroying 0x9273038
destroying 0x9273018
destroying 0x9273008

コントロールがメイン関数に返される前にデストラクタが呼び出された理由がわかりません。さらに重要なのは、なぜそれが呼び出されたのbですか? operator+コントロールがオブジェクトのスコープから出たときにデストラクタが呼び出されるため、返された新しいオブジェクトで呼び出された場合は理解できます。

4

3 に答える 3

2

君は:

  • コピーコンストラクター(現時点ではコンパイラーによって生成されます)の「作成」を出力しないでください(または、実際には、リソースを適切に処理してください)。

  • 一時的a + bに破壊されるのを見ています

于 2013-04-13T17:46:45.253 に答える