C++中用賦值形式op=取代單獨(dú)形式op

字號(hào):

大多數(shù)程序員認(rèn)為如果他們能這樣寫(xiě)代碼:
    x = x + y; x = x - y;
    那他們也能這樣寫(xiě):
    x += y; x -= y;
    如果x和y是用戶定義的類型(user-defined type),就不能確保這樣。就C++來(lái)說(shuō),operator+、operator=和operator+=之間沒(méi)有任何關(guān)系,因此如果你想讓這三個(gè)operator同時(shí)存在并具有你所期望的關(guān)系,就必須自己實(shí)現(xiàn)它們。同理,operator -, *, /, 等等也一樣。
    確保operator的賦值形式(assignment version)(例如operator+=)與一個(gè)operator的單獨(dú)形式(stand-alone)(例如 operator+ )之間存在正常的關(guān)系,一種好方法是后者(指operator+ 譯者注)根據(jù)前者(指operator+= 譯者注)來(lái)實(shí)現(xiàn)(參見(jiàn)條款6)。這很容易:
    class Rational {
    public:
    ...
    Rational& operator+=(const Rational& rhs);
    Rational& operator-=(const Rational& rhs);
    };
    // operator+ 根據(jù)operator+=實(shí)現(xiàn);
    //有關(guān)為什么返回值是const的解釋,
    //參見(jiàn)Effective C++條款21 和 109頁(yè) 的有關(guān)實(shí)現(xiàn)的警告
    const Rational operator+(const Rational& lhs,const Rational& rhs)
    {
    return Rational(lhs) += rhs;
    }
    // operator- 根據(jù) operator -= 來(lái)實(shí)現(xiàn)
    const Rational operator-(const Rational& lhs,const Rational& rhs)
    {
    return Rational(lhs) -= rhs;
    }
    在這個(gè)例子里,從零開(kāi)始實(shí)現(xiàn)operator+=和-=,而operator+ 和operator- 則是通過(guò)調(diào)用前述的函數(shù)來(lái)提供自己的功能。使用這種設(shè)計(jì)方法,只用維護(hù)operator的賦值形式就行了。而且如果假設(shè)operator賦值形式在類的public接口里,這就不用讓operator的單獨(dú)形式成為類的友元(參見(jiàn)Effective C++ 條款19)。
    如果你不介意把所有的operator的單獨(dú)形式放在全局域里,那就可以使用模板來(lái)替代單獨(dú)形式的函數(shù)的編寫(xiě):
    template
    const T operator+(const T& lhs, const T& rhs)
    {
    return T(lhs) += rhs; // 參見(jiàn)下面的討論
    }
    template
    const T operator-(const T& lhs, const T& rhs)
    {
    return T(lhs) -= rhs; // 參見(jiàn)下面的討論
    }
    ...
    使用這些模板,只要為operator賦值形式定義某種類型,一旦需要,其對(duì)應(yīng)的operator單獨(dú)形式就會(huì)被自動(dòng)生成。