c++中有些重载运算符为什么要返回引用?
1、①允许进行连续赋值
②防止返回对象(返回对象也可以进行连续赋值)的时候调用拷贝构造函数和析构函数导致不必要的开销,降低赋值运算符等的效率。
对于第二点原因:如果用“值传递”的方式,虽然功能仍然正确,但由于return语句要把 *this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,会降低赋值函数的效率。
1、需要返回对象引用或者返回对象(效率没有返回引用高),需要实现连续赋值
使重载的运算符更符合C++本身的运算符的语意,=连续赋值, += -= *= /=
<<输出流
2、关于赋值 =,我们知道赋值=有连续等于的特性
int x,y,z;
x = y = z = 15;
同样有趣的是,赋值采用的是右结合律,所以上述连锁赋值被解析为:
x = (y = (z = 15)); //赋值连锁形式
这里15先被赋值给z,然后其结果(更新后的z)再被赋值给y,然后其结果(更新后的y)再被赋值给x。
为了实现“连锁赋值”,赋值操作符号必须返回一个reference指向操作符号的左侧实参(而事实上重载运算符的左侧实参就是调用对象本身,比如= += -=等)
这是你为classes实现赋值操作符时应该遵循的协议:
这个协议不仅仅适用于以上的标准赋值形式,也适用于所有赋值运算

3、这只是个协议,并无强制性,如果不遵循它,代码一样可以通过编译,然而这份协议被所有内置类型和标准程序库提供的类型入string,vector,complex,trl:shared_ptr或者即将提供的类型共同遵守。因此除非你有一个标新立异的好理由,不然还是随众吧。
下面看一个赋值运算符号的例子



4、下面是返回引用的情况String& operator+(const String& str)

5、这样会在赋值运算过程的返回途中调用两次拷贝构造函数和析构函数(因为return的是个新的对象)
如果采用String& operator+(const String& str) 这样就不会有多余的调用(因为这里直接return一个已经存在对象的引用)
如果采用return对象 那么第二次赋值运算调用的情况就是
将一个新的String对象传递到operator+()的参数中去 相当于
const String&str = returnStringObj;
如果采用return对象引用 那么第二次赋值运算的情况就是
将一个已经存在的String对象(其实就是str1)的引用传递到operator+()的参数中去
const String&str = returnReference; (String& returnReference = str1;)
6、+=等运算符也是同样的考虑,比如


7、如果要这样使用+=或其他上面举出的运算符,+=运算的返回值一定要是一个对象或者引用才行,不然就会出现错误(参数类型不符号)。
当然如果确定不会这么使用,直接返回void也是可以
上面的例子也说明了一点,析构函数的调用是在变量作用域结束的时候(以及程序运行结束的时候
在不需要对返回值进行操作的时候,直接返回void就行了,首先要明白一点,运算符左侧的对象就是操作对象比如
ObjectA = ObjectB ObjectA.operator=(ObjectB)
ObjectA+=ObjectB ObjectA.operator+(ObjectB)
下面看返回void


8、返回void也是可以成功完成赋值运算符赋值的
1、①允许进行连续赋值
②防止返回对象(返回对象也可以进行连续赋值)的时候调用拷贝构造函数和析构函数导致不必要的开销,降低赋值运算符等的效率。
对于第二点原因:如果用“值传递”的方式,虽然功能仍然正确,但由于return语句要把 *this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,会降低赋值函数的效率。
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
阅读量:65
阅读量:89
阅读量:28
阅读量:48
阅读量:62