0

我見過很多教程,並試圖在stackoverflow上找到答案,但沒有成功。運算符重載C++參考或值

我不確定的是;有沒有什麼時候通過價值或通過引用返回,當超載運營商?

例如,

Class &operator+(){ 
    Class obj; 
    //... 
    return obj; 
} 

或相同的事情,但按價值

Class operator+(){ 
    Class obj; 
    //... 
    return obj; 
} 

而且我想提,我注意到,在返回相同的對象(*this)時的病例近90%,是在返回的同一個對象上被引用。有人能解釋爲什麼這樣嗎?

+0

you mean like obj = obj1 + obj2 + obj3; ? –

+0

第一個例子是錯誤的,不要通過引用返回一個局部變量。 – masterxilo

回答

2

...有沒有一些實踐時何價值或通過引用返回,當重載操作符?

是的,有一些規範形式found here。它們並不都具有相同的形式 - 它們因操作員而異。一般的建議是遵循內置類型的語義。與所有函數一樣,通用規則仍然適用,例如不返回對局部變量的引用(如OP所示)。

E.g. (在上面的鏈接中找到)給出了問題的添加操作符;

class X 
{ 
public: 
    X& operator+=(const X& rhs) // compound assignment (does not need to be a member, 
    {       // but often is, to modify the private members) 
    /* addition of rhs to *this takes place here */ 
    return *this; // return the result by reference 
    } 

    // friends defined inside class body are inline and are hidden from non-ADL lookup 
    friend X operator+(X lhs,  // passing lhs by value helps optimize chained a+b+c 
        const X& rhs) // otherwise, both parameters may be const references 
    { 
    lhs += rhs; // reuse compound assignment 
    return lhs; // return the result by value (uses move constructor) 
    } 
}; 

operator+是非成員方法(常作爲friend),並返回由值 - 這對應於內建類型的語義。同樣,operator+=是成員方法,通過引用返回(*this的更新版本)。

...當返回相同的對象(*this)時,正在被返回的同一對象上被引用。有人能解釋爲什麼這樣嗎?

如果返回類型是按值(X operator+),然後return *this;意味着當前對象的副本(什麼是this指出)且已返回。

如果返回類型是按引用(X& operator+),然後return *this;意味着當前對象的引用(什麼是this指向)返回(即,不是一個副本)。

+0

所以基本上我需要返回相同的對象的引用,如果我想做鏈加法?沒有其他區別只返回*這個? –

+0

它會創建'* this'的副本。 – Niall

1

通過引用從operator+返回的第一個選項是錯誤的,因爲您通過引用返回本地對象,但本地對象在操作符函數體結束後不再存在。一般:

  • 變異的運營商如+=-=返回引用,因爲它們返回的突變對象本身(作者:return *this;
  • 普通運營商如+-應該由價值迴歸,因爲一個新的對象需要被構建來保持結果。