運算子多載的一般規則

下列規則限制多載運算子的實作方式。 不過,它們不適用於 個別涵蓋的新刪除 運算元。

  • 您無法定義新的運算子,例如

  • 將運算子套用於內建資料類型時,您就無法重新定義運算子的意義。

  • 多載運算子必須為非靜態類別成員函式或全域函式。 全域函式需要存取私用的或受保護的類別成員,必須宣告為該類別的 friend。 全域函式必須至少接受一個為類別或列舉類型或為類別或列舉類型參考的引數。 例如:

    // rules_for_operator_overloading.cpp
    class Point
    {
    public:
        Point operator<( Point & );  // Declare a member operator
                                     //  overload.
        // Declare addition operators.
        friend Point operator+( Point&, int );
        friend Point operator+( int, Point& );
    };
    
    int main()
    {
    }
    

    上述程式碼範例將小於運算子宣告為成員函式;不過,加法運算子會宣告為具有 friend 存取權限的全域函式。 請注意,可以對指定運算子提供一個以上的實作。 上述加法運算子的範例中,提供了兩個實作以協助交替。 將加入 Point 至、 intPointPoint等的運算子可能同樣可能實作。

  • 運算子會遵守其優先順序、群組,以及其搭配內建類型使用時指定的運算元數目。 因此,無法表示「將 2 和 3 新增至類型 Point物件」的概念,預期 2 會新增至 x 座標,並將 3 新增至 y 座標。

  • 宣告為成員函式的一元運算子不接受任何引數;如果宣告為全域函式,則會接受一個引數。

  • 宣告為成員函式的二元運算子接受一個引數;如果宣告為全域函式,則會接受兩個引數。

  • 如果運算子可以做為一元運算子或二元運算子 (&*+-),您可以個別多載每一個使用。

  • 多載運算子不可以有預設引數。

  • 指派 (operator=) 以外的所有多載運算子都會由衍生類別繼承。

  • 成員函式多載運算子的第一個引數,一定是叫用運算子之物件的類別類型 (宣告該運算子的類別,或者從該類別衍生的類別)。 不會對第一個引數提供任何轉換。

請注意,您可以完全改變任何運算子的意義。 這包括位址(&)、指派(=)和函數調用運算符的意義。 此外,還可使用運算子多載變更內建類型所依賴的識別。 例如,下列四個陳述式若進行完整評估,通常是相等的:

var = var + 1;
var += 1;
var++;
++var;

多載運算子的類別類型無法依賴這個識別。 此外,就多載運算子而言,基本類型使用這些運算子的某些隱含條件比較不嚴謹。 例如,加法/指派運算符 +=會要求左操作數在套用至基本類型時成為左操作數;當運算符多載時,就不需要這種需求。

注意

為求一致,最好的作法通常是在定義多載運算子時遵循內建類型的模型。 如果多載運算子的語意與其在其他內容中的意義大不相同,可能會比較容易混淆。

另請參閱

運算子多載