C++运算符重载的一个问题

2025-12-04 11:27:36
推荐回答(2个)
回答1:

对operator + 的重载可以以其中一个对象为基础,而不是新建另外一个对象。

回答2:

补充:没有见具体代码,不大好说,也可能是类的设计不太好。

照你说的情况,是要把一个对象中内部分配的数组传给另一个对象,即使在原对象被析构以后还要求保存有这个数组空间,这是违反了数据封装的原则的,应该避免;如果原对象中的数组不是原对象分配的,那么这个数组空间的回收也不应该由这个对象来做,也不会出现这种问题。所以我猜测可能是类的设计不良问题。

不要用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;
}