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

7
A *operator+(A a)
  {

按价值接收。这意味着当

a + b;

遇到一个新的副本b被创建并传递给 operator+(A a)

您没有看到构造了新的构造函数,因为您没有实现复制构造函数并且编译器为您创建了它。否则,您将看到又创建了一个 A。

如果你改为operator*这样引用

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

您将不会再看到破坏,因为没有创建副本。

于 2013-04-13T17:43:43.860 回答
2

你:

  • 不要为复制构造函数(目前是编译器生成的)输出“创建”(或者,实际上,正确处理您的资源)

  • 正在看到临时的a + b被摧毁

于 2013-04-13T17:46:45.253 回答
0

您对复制构造函数和+运算符的实现是错误的。试试这个:

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

  A(const A &a)
  {
    cout << "copying " << *(a.x) << " " << this << endl;
    x = new int;
    *x = *(a.x);
  }

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

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

  void display()
  {
    cout << *x << endl;
  }
};
于 2013-04-13T17:49:08.767 回答