演算子のオーバーロード

operator キーワードは、クラスのインスタンスに適用されたときの operator-symbol の意味を指定する関数を宣言します。 これによって、演算子に複数の意味を与えます (つまり、"オーバーロード" します)。 コンパイラは、オペランドの型を検査することにより、演算子の異なる意味を区別します。

構文

typeoperatoroperator-symbol(parameter-list)

解説

ほとんどの組み込み演算子の関数をグローバルに、またはクラス単位で定義し直すことができます。 オーバーロードされた演算子は、関数として実装されます。

オーバーロードされた演算子の名前は、operatorx です。x は次の表に示すような演算子です。 たとえば、加算演算子をオーバーロードするために、operator+ と呼ばれる関数を定義します。 同様に、加算/代入演算子 += をオーバーロードするには、operator+= という名前の関数を定義します。

再定義可能な演算子

演算子 名前 Type
, Comma バイナリ
! 論理 NOT 単項
!= 不等式 バイナリ
% 剰余 バイナリ
%= 剰余代入 バイナリ
& ビット演算子 AND バイナリ
& アドレス取得 単項
&& 論理積 バイナリ
&= ビットごとの AND 代入 バイナリ
( ) 関数呼び出し
( ) キャスト演算子 単項
* 乗算 バイナリ
* ポインター逆参照 単項
*= 乗算代入 バイナリ
+ 追加 バイナリ
+ 単項プラス 単項
++ インクリメント 1 単項
+= 加算代入 バイナリ
- 減算 バイナリ
- 単項マイナス符号 単項
-- デクリメント 1 単項
-= 減算代入 バイナリ
-> メンバー選択 バイナリ
->* メンバーへのポインター選択 バイナリ
/ 区分 バイナリ
/= 除算代入 バイナリ
< より小さい バイナリ
<< 左シフト バイナリ
<<= 左シフト代入 バイナリ
<= 以下 バイナリ
= 譲渡 バイナリ
== 等式 バイナリ
> より大きい バイナリ
>= 以上 バイナリ
>> 右シフト バイナリ
>>= 右シフト代入 バイナリ
[ ] 配列インデックス
^ 排他的 OR バイナリ
^= 排他的 OR 代入 バイナリ
| ビット演算子包含的 OR バイナリ
|= ビットごとの包括的 OR 代入 バイナリ
|| 論理和 バイナリ
~ 1 の補数 単項
delete 削除
new 新しい
変換演算子 変換演算子 単項

1 単項インクリメントおよびデクリメント演算子には、前置インクリメントと後置インクリメントの 2 種類のバージョンがあります。

詳細については、「演算子のオーバーロードに関する一般的なルール」を参照してください。 さまざまなカテゴリのオーバーロードされた演算子に対する制約については、次のトピックを参照してください。

次のテーブルに示す演算子は、オーバーロードできません。 テーブルにはプリプロセッサ シンボル # および ## が含まれます。

再定義不可演算子

演算子 名前
. メンバー選択
.* メンバーへのポインター選択
:: スコープ解決
? : 条件
# プリプロセッサによる文字列への変換
## プリプロセッサによる連結

オーバーロードされた演算子は通常、コードに出現すると、コンパイラによって暗黙的に呼び出されますが、メンバーまたは非メンバー関数を呼び出すのと同じ方法で明示的に呼び出すことができます。

Point pt;
pt.operator+( 3 );  // Call addition operator to add 3 to pt.

次の例では、+ 演算子をオーバーロードして、2 つの複素数を加算して結果を返すようにします。

// operator_overloading.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

struct Complex {
   Complex( double r, double i ) : re(r), im(i) {}
   Complex operator+( Complex &other );
   void Display( ) {   cout << re << ", " << im << endl; }
private:
   double re, im;
};

// Operator overloaded using a member function
Complex Complex::operator+( Complex &other ) {
   return Complex( re + other.re, im + other.im );
}

int main() {
   Complex a = Complex( 1.2, 3.4 );
   Complex b = Complex( 5.6, 7.8 );
   Complex c = Complex( 0.0, 0.0 );

   c = a + b;
   c.Display();
}
6.8, 11.2

このセクションの内容

関連項目

C++ の演算子、優先順位と結合規則
キーワード