運算子多載的一般規則
下列規則限制如何多載的運算子實作。 不過,它們並不適用於新 和 刪除運算子,會分別討論。
您無法定義新的運算子,例如貴。
您無法重新定義運算子套用至內建資料型別時的意義。
多載的運算子必須是一個非靜態類別成員函式或全域函式。 必須為該類別的 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到Point, int到Point,依此類推,即可實作。
運算子會遵循優先順序,群組,並與內建型別的運算元的數目取決於由一般的用法。 因此,沒有 1989 概念"2 和 3 加入型別的物件Point,"必須要有 2 新增到 x 座標和 3,加入 y 協調。
宣告為成員函式的一元 (unary) 運算子會將任何引數。 如果宣告為全域函式,它們會取用一個引數。
宣告為成員函式的二元運算子會將一個數字。 如果宣告為全域函式,它們會使用兩個引數。
如果運算子可用來做為一元或二元運算子 (與, *, +,以及 -),您可以多載化每種使用方式分別。
多載的運算子不能有預設引數。
所有多載運算子,除了 [工作分派 (operator=) 由衍生類別繼承。
成員函式多載運算子的第一個引數永遠是類別的物件型別為運算子即叫用 (類別內宣告運算子,或衍生自該類別的類別)。 沒有轉換所提供的第一個引數。
請注意可以完全變更任何一個運算子的意義。 包含的地址的意義 (與),工作分派 (=),和函式呼叫運算子。 此外,可以使用運算子多載化變更可依賴內建型別的多個識別。 比方說,下列四個陳述式是完全評估時,通常是相同的:
var = var + 1;
var += 1;
var++;
++var;
對於多載運算子的類別型別不能依賴這個識別。 此外,某些基本的型別的兩個運算子的隱含使用中的需求被鬆散的多載的運算子。 比方說,/加法運算子, +=,要求,如果左的運算元必須是左值時套用到基本的型別 ; 當多載的運算子時,沒有這類的需求。
![]() |
---|
為了保持一致性,最好經常定義多載的運算子時,請依照下列內建型別的模型。如果從它的意義,在其他內容中的多載的運算子語意則有大幅的不同,它可能會疑惑而無法很有用。 |