演算子のオーバーロード
operator のキーワードはクラスのインスタンスに適用される関数のどの operator-symbol が意味を宣言するかを指定します。これは複数の演算子を指定するまたは 「」でオーバーロードできます。コンパイラは演算子の意味とのオペランドの型を調べることによって区別します。
type operator operator-symbol ( parameter-list )
解説
クラスまたはクラスの基本単位の関数を大部分の組み込み演算子のグローバルに定義し直すことができます。オーバーロードされた演算子は関数として実装されます。
オーバーロードされた演算子の名前を次の表に表示される x で演算子の operatorx です。たとえば加算演算子のオーバーロードはoperator+ と呼ばれる関数を定義します。同様に加算代入演算子としては+= オーバーロードはoperator+= と呼ばれる関数を定義します。
Redefinable 演算子
[演算子] |
名前 |
種類 |
---|---|---|
, |
コンマ |
Binary |
! |
論理 NOT |
単項式 |
!= |
非等値 |
Binary |
% |
剰余 |
Binary |
%= |
残りの割り当て |
Binary |
& |
ビットごとの AND |
Binary |
& |
Address |
単項式 |
&& |
論理 AND |
Binary |
&= |
ビットごとの AND 代入 |
Binary |
( ) |
関数呼び出し |
— |
( ) |
キャスト演算子 |
単項式 |
* |
乗算 |
Binary |
* |
ポインターの逆参照 |
単項式 |
*= |
乗算代入 |
Binary |
+ |
加算 |
Binary |
+ |
と単項 |
単項式 |
++ |
インクリメント 1 |
単項式 |
+= |
加算代入 |
Binary |
– |
減算 |
Binary |
– |
単項マイナス符号 |
単項式 |
–– |
デクリメント 1 |
単項式 |
–= |
減算代入 |
Binary |
–> |
メンバー選択 |
Binary |
–>* |
メンバーへのポインターの選択 |
Binary |
/ |
除算 |
Binary |
/= |
除算代入 |
Binary |
< |
より小さい |
Binary |
<< |
左シフト |
Binary |
<<= |
左シフト代入 |
Binary |
<= |
以下 |
Binary |
= |
代入 |
Binary |
== |
等価比較 |
Binary |
> |
より大きい |
Binary |
>= |
以上 |
Binary |
>> |
右シフト |
Binary |
>>= |
右シフト代入 |
Binary |
[ ] |
配列の添字 |
— |
^ |
排他的 OR |
Binary |
^= |
排他的 OR 代入 |
Binary |
| |
ビットごとの包括的 OR |
Binary |
|= |
ビットごとの包括的 OR 代入 |
Binary |
|| |
論理 OR |
Binary |
~ |
1 の補数 |
単項式 |
delete |
Delete |
— |
new |
New |
— |
conversion operators |
変換演算子 |
単項式 |
単項 1 つがインクリメントおよびデクリメント演算子の二つのバージョンです : 2 preincrement と postincrement。
詳細については演算子のオーバーロードの一般的な規則 を参照してください。オーバーロードされた演算子さまざまなカテゴリの制約は次のトピックで説明されています :
次の表に示す演算子はオーバーロードできません。テーブルはプリプロセッサ シンボル # と ## が含まれています。
Nonredefinable の演算子
Operator |
Name |
. |
メンバー選択 |
.* |
メンバーへのポインターの選択 |
:: |
スコープ解決 |
? : |
条件 |
# |
プリプロセッサの文字列への変換 |
## |
プリプロセッサは連結します。 |
コードにある場合オーバーロードされた演算子は通常コンパイラによって暗黙的に呼び出されますがそのメンバーまたは非メンバー関数で呼び出されると同じ方法で明示的に呼び出すことがあります :
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