簡體   English   中英

為什么在賦值運算符重載中返回引用?

[英]Why a reference is returned in an assignment operator overload?

我讀到,引用是從重載的賦值運算符返回的,以啟用運算符鏈接。 但是,如果沒有這種回報,運營商鏈似乎也可以奏效。

有人可以闡明這一點嗎?

class A
{
    public:
        int x,y;
        char* str;

        //Default Constructor
        A(){}

        //Constructor
        A(int a, int b, char* s){
            cout<<"initialising\n";
            x = a;
            y = b;
            str = new char[10];
            str = s;
        }

        //Destructor
        ~A(){}

        //Overloaded assignment operator
        const A& operator=(const A& obj)
        {
            cout<<"Invoking Assignment Operator\n";
            x = obj.x;
            y = obj.y;
            str = new char[10];
            str = obj.str;

            //return *this;
        }
};

ostream& operator<<(ostream& os, const A& obj)
{
    os <<"X="<< obj.x<<" Y="<<obj.y<<" Str="<<obj.str<<"\n";
    return os;
}

int main()
{
    A c(3,4,"Object C");
    cout<<c;

    A d, e, f;
    d = e = f = c;  //Assignment operator invoked 3 times
    cout<<e;
}

輸出:

initialising
X=3 Y=4 Str=Object C
Invoking Assignment Operator
Invoking Assignment Operator
Invoking Assignment Operator
X=3 Y=4 Str=Object C

您正在遇到未定義的行為,因為operator =期望的返回類型為const A&並且沒有返回任何內容。

不幸的是它為您工作。 (是的,很不幸,因為似乎有效的未定義行為是最糟糕的)

我在MSVS中遇到編譯錯誤,ideone.com遇到運行時錯誤。

http://ideone.com/xTDb6

此規則源自如下代碼:

struct Foo { 
    Foo& copy(const Foo& x) { 
        return (*this = x); 
    } 
};

當時,C ++有兩點不同:

  1. 默認情況下,由編譯器生成的operator =返回一個右值,並且
  2. 編譯器允許非常量引用綁定到臨時對象。

上面的代碼旨在等同於:

*this = x;
return *this;

但是,這不是-因為operator=返回了一個右值,編譯器生成了一個臨時變量來保存賦值結果,然后由於該函數返回了引用,因此它返回了對該臨時變量的引用。 然后,當然,事情匆匆忙忙,因為您現在懸而未決地引用了一個臨時對象,該臨時對象在創建它的完整表達式的末尾被銷毀了。 簡而言之,這是一個返回對本地的引用的類情況-除了需要花大量的分析才能意識到本地正在生成時,更不用說對它的引用了。

如果定義operator=返回值而不是引用,則必須生成一個臨時值,就像編譯器在上面的代碼中所做的一樣。 我沒有仔細考慮其余的內容,以弄清楚在這種情況下當前語言的其他更改是否足以保護您,但是我的直接反應是,您大約要重新構造那個古老的bug,因此,除非您在此問題上別無選擇,否則我會遠離的。

暫無
暫無

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

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