最终的目的是为了进行连续的运算

1
a = b + c + d; //不只是两个对象相加,是为了两个以上的对象的相加

以上面的代码为例,假设a,b,c,d都是同一个类(classA)的不同对象,假如我重载这个类的加号时,返回值类型不是此类或者他的引用,如下

1
2
3
4
void operator+(classA &a, classA &b)
{
//加法运算
}

那么在我最上面的代码中,b + c 的值就为空(或者其他类型),那么这个得出来的值就没有办法继续和d来进行加法的运算,也没有办法赋值给a了,这也就无法实现我所期望的连续运算的目的。
所以,c++重载运算符时返回值为类的对象是为了实现连续的运算(大多数这种运算其实是赋值运算或者<< >>)
如果你以后要重载运算符,有什么连续运算的需要,就可以使用这种方法,不过最好也要遵守c++中一些语法的规定,不要重载出来的东西让人摸不着头脑

那么,现在讲为什么有一些函数要返回对象的引用,这其实是为了提高程序的运行效率,众所周知,当一个函数返回一个值时,他并不是将你在此函数里面原有的你想要的那个值返回,而是将你想要的那个值,复制一下,然后把这个复制出来的值给返回,如下

1
2
3
4
5
6
classA operator+(classA &a, classA &b)
{
classA temp;
//加法运算
return temp;
}

代码最终返回的并不是你在函数里定义的那个temp,而是将temp复制了一份,将复制的那份返回了,函数里定义的那个temp在函数运行结束后就释放了。同理,就算你没有在函数里面新建东西,而是直接返回通过a和b运算出来的一些东西(或者你直接返回*this),他也要复制一下。

所以,只要你不采用返回类的对象,而是返回类的对象的引用,就不会复制,也即不会调用类的复制构造函数,也即提升了程序的效率

1
2
3
4
5
6
7
classA & operator+(classA &a, classA &b)
{
//加法运算
//a.time = a.time + b.time; //假设time是此类的一个属性
//return a;
//加法只有这样可以实现连续的运算,有些鸡肋,但是=,<<,>>,就很好用了
}

所以,当你重载的运算符需要连续的运算时,你可以返回他的类的对象。如果你想要减少不必要的开销(复制构造函数),提高程序效率,并且你返回的对象是需要作为左值的话,那么你可以返回他的引用

不过绝大部分 返回对象 或者 他的引用 实现连续运算,都是用在重载 赋值运算符= 或者 插入运算符<< 或者 提取运算符>> 中的。那里面比较好用,其他的如加法那些,连续运算就很鸡肋,也比较难实现,但是返回引用可以提升效率却是真真的好啊