手抄报 安全手抄报 手抄报内容 手抄报图片 英语手抄报 清明节手抄报 节约用水手抄报

c++中有些重载运算符为什么要返回引用

时间:2024-11-09 05:36:11

1、需要返回对象引用或者返回对象(效率没有返回引用高),需要实现连续赋值使重载的运算符更符合C++本身的运算符的语意,=连续赋值, += -= *= /=<<输出流

2、关于赋值 =,我们知道赋值=有连续等于的特性int x,y,z;x = y = z = 15;同样有趣的是,赋值采用的是右结合律,所以上述连锁赋值被解析为:x = (y = (z = 15)); //赋值连锁形式这里15先被赋值给z,然后其结果(更新后的z)再被赋值给y,然后其结果(更新后的y)再被赋值给x。为了实现“连锁赋值”,赋值操作符号必须返回一个reference指向操作符号的左侧实参(而事实上重载运算符的左侧实参就是调用对象本身,比如= += -=等)这是你为classes实现赋值操作符时应该遵循的协议:这个协议不仅仅适用于以上的标准赋值形式,也适用于所有赋值运算

c++中有些重载运算符为什么要返回引用

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

c++中有些重载运算符为什么要返回引用
c++中有些重载运算符为什么要返回引用
c++中有些重载运算符为什么要返回引用

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

c++中有些重载运算符为什么要返回引用

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、+=等运算符也是同样的考虑,比如

c++中有些重载运算符为什么要返回引用
c++中有些重载运算符为什么要返回引用

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

c++中有些重载运算符为什么要返回引用
c++中有些重载运算符为什么要返回引用

8、返回void也是可以成功完成赋值运算符赋值的

© 手抄报圈