簡體   English   中英

為什么我應該將C ++運算符作為全局函數(STL)重載?有什么警告?

[英]Why should I overload a C++ operator as a global function (STL does) and what are the caveats?

為什么我要將C ++ operator()重載為全局而非成員函數。 例如, ==運算符。

為什么這樣做? 例如在STL庫中。

通常的規則是將修改左手對象的操作符作為成員,將返回新對象的二元操作符作為自由函數; 后者的主要動機是因為編譯器不會轉換左側以匹配成員; 如果您的類支持任何隱式轉換,那么所有常用的二元運算符都應該是自由函數,因此適用相同的轉換規則
對於左手側和右手側,例如:

class Complex
{
public:
    Complex(double r, double i = 0.0);
    bool operator==( Complex const& other ) const;
};

Complex a;
//  ...
if ( a == 1.0 ) // OK
//  ...
if ( 1.0 == a ) // error.

但:

class Complex
{
public:
    Complex(double r, double i = 0.0);
    friend bool operator==( Complex const& lhs, Complex const& rhs ) const;
};

Complex a;
//  ...
if ( a == 1.0 ) // OK
//  ...
if ( 1.0 == a ) // OK

實現這一目標的一種優雅方法是根據成員函數定義基本操作 - 例如+- ,這些是operator+=operator-= ; 為了進行比較,您需要定義一個任意約定,一個成員isEqual或者compare (根據結果返回<==>零),然后從模板繼承:

template <typename T>
class ArithmeticOperators
{
    friend T operator+( T const& lhs, T const& rhs )
    {
        T result( lhs );
        result += rhs;
        return result;
    }
    //  And so on, for all of the binary operators.
};

class Complex : public ArithmeticOperators<Complex>
{
public:
    //  ...
    Complex& operator+=( Complex const& other );
    //  etc.
};

請注意,有一些參數可以使operator <op>= functions free函數:free函數將非const引用作為其第一個參數,因此需要一個左值(如內置operator <op>= )。 然而,這似乎不是通常的做法,可能是因為operator=必須是成員,並且在同一個mannter中處理operator <op>=似乎更自然。

如果我沒記錯的話, operator =必須是一個成員函數。 關於operator == ,我認為你實際上並不是指全局而是自由函數(STL並不是全局定義運算符)。 有幾件事需要考慮,一個是與類本身脫鈎:如果您的運算符可以根據類的公共接口進行定義,那么最好以這種方式實現它以保持對實現內部的訪問到最低限度。 另一個基本優點是可以實現一個操作符,其類型作為第二個操作數,考慮類型T和U之間的相等:

bool operator ==( T const& t, U const& u ){ ... }
bool operator ==( U const& t, T const& u ){ ... }

如果可以同等地比較T和U類型的對象,那么t == uu == t都有效並且兩者都產生相同的結果是有意義的。 如果你將這個運算符定義為一個成員函數,那么一個將在T的實現中,另一個在U的實現中。現在考慮U是你控制之外的第三方類型,或者更好的是一個基本類型,如int ,現在沒有其他方法可以提供這樣的運算符,但提供它的自由函數版本。

將成員函數與參數匹配的規則與匹配自由函數的第一個參數的規則不同。 我不確定它們是如何不同的,但由於它們不同,實際上最好將大多數二元運算符實現為自由函數而不是成員函數,以便參數匹配對兩個參數對稱運算。

除了postfix ++ ,那是因為它不是真正的二元運算符,只有在重載它時才會播放一個,以便有一種區分它和前綴++

暫無
暫無

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

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