4

从函数“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;
}
4

2 回答 2

3

按值返回返回对象的副本。通过引用返回返回对象本身。

您要使用哪一个取决于您要如何使用返回的值。如果想修改不影响原对象(返回后),按值返回;否则通过引用返回。

使用 operator= 成员函数时的约定是通过引用返回。这允许您链接对象上的操作:

CComplexNumber a(1,2);
CComplexNumber b(3,4);

(a = b) *= 2; //Assignment of b to a, then scale by 2

现在,在赋值后按值返回,*=不会修改 value a,因为 a 的副本将按 2 缩放。通过引用返回,b将被分配给a并且a自身将按 2 缩放。

于 2013-07-30T17:18:11.823 回答
2

返回一个引用(可变的)是最不令人惊讶的,你真正应该为一个如此常见的操作选择什么是隐式声明的。引用是默认/隐式定义的返回类型。

例子:

A operator=(const A&) = default; // ERROR
const A& operator=(const A&) = default; // ERROR
A& operator=(const A&) = default; // OK

如果您没有在用户定义的函数中返回引用,一些编译器会警告您。

除了令人惊讶的(有时是昂贵的)副本之外,它还避免了切片。

返回 const 引用可能会禁止移动。

于 2013-07-30T17:29:47.887 回答