对operator + 的重载可以以其中一个对象为基础,而不是新建另外一个对象。
补充:没有见具体代码,不大好说,也可能是类的设计不太好。
照你说的情况,是要把一个对象中内部分配的数组传给另一个对象,即使在原对象被析构以后还要求保存有这个数组空间,这是违反了数据封装的原则的,应该避免;如果原对象中的数组不是原对象分配的,那么这个数组空间的回收也不应该由这个对象来做,也不会出现这种问题。所以我猜测可能是类的设计不良问题。
不要用new,用个auto型的变量就可以了。这样一来返回这个auto类型的对象就行了。类似a + b这个叫临时对象,是C++自行处理的、自行调用析构函数的,不用自己操心。
C++标准规定,临时对象的寿命是一个命令行(或是一个最小作用子表达式?记不清了),这一行执行完了它就自动析构了。你要做的仅仅是把析构函数写好就可以了。
附:实验测试这个问题的办法是,在析构函数里写一个输出语句,在重载运算符的命令行后也写一个输出语句,让每次析构都可见就行了。如:
#include
using namespace std;
class T {
public:
T operator+(T& b) {T ret(i + b.i); return ret;}
T(int a) {i = a; cout << "Cons" << i << endl;}
~T() {cout << "Dest" << i << endl;}
int i;
};
int main()
{
T a = 5, b = 6;
cout << (a + b).i << endl;
cout << "before exit." << endl;
return 0;
}