从函数“operator =”
返回有什么区别by reference
by value
?这两个版本似乎在下面的示例中产生了正确的结果。
#include <iostream>
using namespace std;
class CComplexNumber{
float m_realPart;
float m_imagPart;
public:
CComplexNumber(float r,float i):m_realPart(r),m_imagPart(i){}
//the following can be also
//CComplexNumber& operator=(const CComplexNumber& orig){
CComplexNumber operator=(const CComplexNumber& orig){
if (this!=&orig){
this->m_realPart=orig.m_realPart;
this->m_imagPart=orig.m_imagPart;
}
return *this;
}
friend ostream& operator<<(ostream& lhs,CComplexNumber rhs){
lhs<<"["<<rhs.m_realPart<<","<<rhs.m_imagPart<<"]"<<endl;
}
};
int main() {
CComplexNumber a(1,2);
CComplexNumber b(3,4);
CComplexNumber c(5,6);
a=b=c;
cout<<a<<b<<c;
return 0;
}
答案 0 :(得分:3)
按值返回会返回对象的副本。通过引用返回返回对象本身。
您要使用哪一个取决于您希望如何使用返回的值。如果要修改它而不影响原始对象(返回后),请按值返回;否则以引用方式返回。
使用operator = member函数时的约定是通过引用返回。这允许您对对象进行链接操作:
CComplexNumber a(1,2);
CComplexNumber b(3,4);
(a = b) *= 2; //Assignment of b to a, then scale by 2
现在,在分配后按值返回时,*=
不会修改值a
,因为a的副本将缩放为2.返回根据参考,b
将分配给a
,a
本身将按2缩放。
答案 1 :(得分:2)
返回引用(mutable)是最不令人惊讶的,你真正应该选择的是一个非常常见的操作,它是隐式声明的。 Reference是默认/隐式定义的返回类型。
示例:
A operator=(const A&) = default; // ERROR
const A& operator=(const A&) = default; // ERROR
A& operator=(const A&) = default; // OK
如果您没有在用户定义的函数中返回引用,某些编译器会发出警告。
除了令人惊讶的(有时是昂贵的)副本之外,它还避免了切片。
返回const引用可以禁止移动。