原因是:
+,-,*等返回不了引用,比如+运算符,可以如下重载(为了简单,假设A 只有int x;int y)
A operator+(A a,A b) {A sum; sum.x=a.x+b.x; sum.y=a.y+b.y; return sum; }
分析不能用引用的原因: 函数传入了两个参数a,b,并且+只能传入两个参数(c++不允许自己创造运算符),这样就限定了和sum不能作为参数传入,所以sum只能是一个函数里的临时变量,但是临时变量在函数结束时是要销毁的,那么函数调用玩,sum就没有了, 如果返回引用,引用源都已经没有了,还怎么引用,引用哪里的东西呢??
所以不能引用。
<<,>>可以返回引用,而且不返回引用也是编译不过的,貌似是c++的要求。可以不用引用试一试,有的编译器会出来一个ios_base.h文件,就是想告诉你用引用。
返回引用也是可以解释的。 比如还是上面的A类型,如下
ostream& operator<<(ostream& out, const A& a) { out< 能返回引用,首先是因为out是作为参数传入的,不是函数的临时变量,函数结束时它仍然存在,这样就可以引用了。 再者,返回引用效率高,不用拷贝一个新的,直接返回它自己。 而且,返回引用有助于连着调用。比如cout<
operator<<(operator<<(operator<<(operato<<(cout,a),b),c),d);
C++ Primer里有解释的,一切是为了保持与内置操作的一致性,并非一定要这样,只是这样做才是规范的,还是那句话保持与内置操作的一致性!!!
你可以认为在函数中产生了新的对象,并且需要返回的就是新产生的这个对象,就返回对象;
如果在函数中没有产生新的对象,需要返回的是调用函数之前就存在的对象,就返回引用。
如果返回的是引用,那么a+b=5这样的表达式你说怎么理解?
返回怎样的值,是基于需求考虑的,+-*/的结果,只需要临时使用,因此,返回对象就行了,至于返回引用,可以一方面可以继续处理,另一方面,没有复制拷贝的代价,更高效。