如果你的运算符重载函数写成了返回reference的形式:
class A { public: A(int a,int b):x(a),y(b){} friend const A& operator*(const A& a, const A& b); private: int x; int y; }; const A& operator*(const A& a, const A& b) { A aa(a.x * b.x, a.y / b.y); return aa; }但是这样写是错误的,一旦使用引用返回前,一定要想清楚当前引用的对象在哪,是谁,而函数内的对象是在stack上创建的,一旦函数栈帧被销毁,那么该stack上的值也不复存在。那么引用它必然接收不到任何值。
如果在heap上开辟对象:
const A& operator*(const A& a, const A& b) { A* aa = new A(a.x * b.x, a.y / b.y); return *aa; }存在的问题是:
A a, b, c, d; a = b * c * d;如果这样写,那么会调用两次operator* , 所以使用了两次new。同时就需要两次delete才能保证内存不泄露,但是却没有合理的办法让operator*使用者进行那些delete调用,因为没有合理的办法让他们取得operator*返回的引用指向一个被定义于函数内部的static A对象。
如果定义对象为static类型:
const A& operator*(const A& a, const A& b) { static A ret(0,0); ret= A(a.x * b.x, a.y / b.y); return ret; }存在的问题是:
1.存在了线程安全问题。
2.
const bool operator==(const A& a, const A& b) { A a, b, c, d; if ((a * b) == (c * d)) { } else { } }表达式(a * b) == (c * d)总是被核算为true,因为上述式子等价于:
if(operator==operator*(a,b),operator*(c,d))
两次operator确实改变了它们的值,但是由于它们返回的都是reference,因此调用者看到的都是static A对象的“现值”