C++运算符重载,+-*⼀的重载,返回值为什么是对象而不是对象的引用?而流操作符<< 和 >> 却返回的是引用?

2025-04-16 11:51:21
推荐回答(4个)
回答1:

原因是:

  1. +,-,*等返回不了引用,比如+运算符,可以如下重载(为了简单,假设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就没有了, 如果返回引用,引用源都已经没有了,还怎么引用,引用哪里的东西呢??

    所以不能引用。

  2. <<,>>可以返回引用,而且不返回引用也是编译不过的,貌似是c++的要求。可以不用引用试一试,有的编译器会出来一个ios_base.h文件,就是想告诉你用引用。

    返回引用也是可以解释的。 比如还是上面的A类型,如下

    ostream& operator<<(ostream& out, const A& a) { out<

    能返回引用,首先是因为out是作为参数传入的,不是函数的临时变量,函数结束时它仍然存在,这样就可以引用了。  再者,返回引用效率高,不用拷贝一个新的,直接返回它自己。 而且,返回引用有助于连着调用。比如cout<

    operator<<(operator<<(operator<<(operato<<(cout,a),b),c),d);

    从左到右先执行cout<

回答2:

C++ Primer里有解释的,一切是为了保持与内置操作的一致性,并非一定要这样,只是这样做才是规范的,还是那句话保持与内置操作的一致性!!!

回答3:

你可以认为在函数中产生了新的对象,并且需要返回的就是新产生的这个对象,就返回对象;
如果在函数中没有产生新的对象,需要返回的是调用函数之前就存在的对象,就返回引用。

回答4:

如果返回的是引用,那么a+b=5这样的表达式你说怎么理解?
返回怎样的值,是基于需求考虑的,+-*/的结果,只需要临时使用,因此,返回对象就行了,至于返回引用,可以一方面可以继续处理,另一方面,没有复制拷贝的代价,更高效。