C++ のほとんどの組み込み演算子の関数を、再定義または多重定義することができます。
これらの演算子は、グローバルに、またはクラス単位で多重定義できます。
多重定義された演算子は、関数としてインプリメントされ、
メンバー関数またはグローバル関数になることができます。
演算子の前にキーワード operator を置いて、演算子関数を宣言します。 多重定義された演算子は、多重定義された関数とは別個のものです。ただし、 多重定義された関数と同様、演算子で使用されるオペランドの数と型によって区別されます。
標準の + (プラス) 演算子について考えます。 この演算子が異なる標準型のオペランドで使用される場合は、演算子の意味が多少変わります。 例えば、2 個の整数の加算は、2 個の浮動小数点数の加算と同様にはインプリメントされていません。 C++ では、標準の C++ 演算子をクラス型に適用するときに、 それらにユーザー独自の意味を定義することができます。 次の例では、complx と呼ばれるクラスが、複素数のモデルに定義されます。 そして + (プラス) 演算子は、2 つの複素数を加算するようにこのクラスで再定義されます。
// This example illustrates overloading the plus (+) operator. #include <iostream> using namespace std; class complx { double real, imag; public: complx( double real = 0., double imag = 0.); // constructor complx operator+(const complx&) const; // operator+() }; // define constructor complx::complx( double r, double i ) { real = r; imag = i; } // define overloaded + (plus) operator complx complx::operator+ (const complx& c) const { complx result; result.real = (this->real + c.real); result.imag = (this->imag + c.imag); return result; } int main() { complx x(4,4); complx y(6,6); complx z = x + y; // calls complx::operator+() }
次の演算子は、いずれも多重定義できます。
+ | - | * | / | % | ^ | & | | | ~ |
! | = | < | > | += | -= | *= | /= | %= |
^= | &= | |= | << | >> | <<= | >>= | == | != |
<= | >= | && | || | ++ | -- | , | ->* | -> |
( ) | [ ] | new | delete | new[] | delete[] |
ここで、() は関数呼び出し演算子、 [] は 添え字演算子です。
下記の演算子の単項形式と 2 項形式の両方共、多重定義が可能です。
+ | - | * | & |
|
|
|
|
|
次の演算子は、多重定義できません。
. | .* | :: | ?: |
|
|
|
|
|
プリプロセッサー記号の # と ## は、多重定義できません。
演算子関数は、非静的メンバー関数であってもかまわないし、あるいは、クラス、クラスへの参照、 列挙、または列挙型への参照であるパラメーターを少なくとも 1 つ持っている、 非メンバー関数であってもかまいません。
演算子の優先順位、グループ分け、またはオペランドの数は変更できません。
多重定義された演算子 (関数呼び出し演算子を除く) は、引き数リストの中にデフォルト引き数や 省略符号を入れることはできません。
多重定義された =、[]、()、および -> の各演算子は、 第 1 オペランドとして必ず左辺値を受け取ることができるように、 非静的メンバー関数として宣言する必要があります。
演算子 new、delete、new[]、および delete[] は、 本節で説明する一般規則には従いません。
= 演算子を除く全演算子は継承されます。
関連参照