2016-02-02 88 views
1

即使我們已經超載了+=運算符,是否有必要過載運算符+=超載複合賦值運算符

+1

做加法然後賦值與'+ ='不是一回事。然後最終的結果*可能*是相同的,但不同的事情正在發生。如果任何重載操作符有副作用(有意或無意),這一點尤其重要。 –

+0

謝謝@JoachimPileborg – Walidix

回答

1

您打算使用+=運算符嗎?如果是,那麼是的,你應該超載它。

即使過載了operator+和賦值運算符,編譯器也不會自動創建一個。你可以相互實施它們,但都需要實施。一般而言,添加和分配與複合賦值完成相同的功能,但情況並非總是如此。

一般情況下,超載的算術運算符時(+-等),你應該做他們與他們相關的複合賦值以及(+=-=等)。

有關某些規範實現的cppreference,請參閱"Binary arithmetic operators"

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) 
    } 
}; 

SO Q&A了一些基本的規則超載。

+0

謝謝你的答案@Niall – Walidix

+0

@WalidSalhi。我的榮幸。 – Niall

0

是的,在總體上是一個好主意,提供內建類型(如int)時實現運算符重載,以避免混淆相同的行爲。

並且沒有operator+=,您必須使用operator+operator=來做同樣的事情。即使使用RVO,也會再次應用副本。

如果您決定實施operator+=,最好使用它來實現operator+的一致性。

+0

謝謝你的回答@songyuanyao – Walidix

+0

@WalidSalhi不客氣。 – songyuanyao