単項演算子のオーバーロード
前置あるいは後置単項演算子は 2 つの方法でオーバーロードすることができます。引数をとらない非静的メンバー関数を宣言する方法と,引数を 1 つとる非メンバー関数を宣言する方法です。ここで,@ が単項演算子を表しているとすると,@x と x@ はどちらも,行われた宣言に従って,x.operator@() あるいは operator@(x) と解釈されます。両方の書式がともに宣言されている場合には,あいまいさを解消するために,標準の引数の対応づけが適用されます。
- C++ 2.0 以下では,オーバーロード演算子 ++ または -- は,前置演算子としても後置演算子としても使用できる
- C++ 2.1 では,++ 演算子または -- 演算子を引数なしのメンバー関数か,引数を 1 つとる非メンバー関数として宣言すると,前置演算子としての ++ または -- だけをオーバーロードする。後置演算子としての ++ または -- をオーバーロードするには,int 引数をとるメンバー関数,またはクラスおよび int 引数を 1 つずつとる非メンバー関数として定義する
前置演算子としてのみ ++ 演算子または -- 演算子をオーバーロードし,後置演算子としてクラスオブジェクトに使うと,コンパイラは警告を発し,前置演算子を呼び出して 2.0 のコードをコンパイルできるようにします。たとえば,以下のような警告が表示されます。
【Warning: Overloaded prefix 'operator ++ ' used as a postfix operator in function func()】(警告:オーバーロードされた前置演算子 'operator ++' が後置演算子として使われている)
【Warning: Overloaded prefix 'operator --' used as a postfix operator in function func()】(警告:オーバーロードされた前置演算子 'operator --' が後置演算子として使われている)