请考虑以下部分代码。
#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
我无法理解为什么在将控件返回到main函数之前调用析构函数。更重要的是,为什么要调用b
?如果在operator+
返回的新对象上调用它,那么当控件超出对象范围时,会调用析构函数,这是可以理解的。
答案 0 :(得分:6)
A *operator+(A a)
{
按价值收货。这意味着什么时候
a + b;
遇到,会创建b
的新副本并将其传递给operator+(A a)
你没有看到构造一个新的,因为你没有实现复制构造函数,编译器为你创建了它。否则你会看到另外一个A被创建。
如果您改为使operator*
像这样引用
A *operator+(A& a)
{
return new A(*x + *(a.x));
}
您不会再看到破坏,因为没有创建副本。
答案 1 :(得分:2)
您:
不要为复制构造函数(目前是编译器生成的)输出“正在创建”(或者确实正确地处理资源)
看到临时a + b
被破坏
答案 2 :(得分: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;
}
};