簡體   English   中英

返回類型的運算符= - 引用或值?

[英]Return type of operator= - reference or value?

從函數“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;
}

按值返回會返回該對象的副本 通過引用返回返回對象本身。

您要使用哪一個取決於您希望如何使用返回的值。 如果要修改它而不影響原始對象(返回后),請按值返回; 否則以引用方式返回。

使用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將被分配給aa自身將按2縮放。

返回引用(可變)是最不令人驚訝的,你真正應該選擇的是一個非常常見的操作,它是隱式聲明的。 Reference是默認/隱式定義的返回類型。

例:

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

如果您沒有在用戶定義的函數中返回引用,一些編譯器會警告您。

除了令人驚訝的(有時是昂貴的)副本之外,它還避免了切片。

返回const引用可以禁止移動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM