演算子のオーバーロード
operator
キーワードは、クラスのインスタンスに適用されたときの operator-symbol の意味を指定する関数を宣言します。 これによって、演算子に複数の意味を与えます (つまり、"オーバーロード" します)。 コンパイラは、オペランドの型を検査することにより、演算子の異なる意味を区別します。
構文
type
operator
operator-symbol(parameter-list)
解説
ほとんどの組み込み演算子の関数をグローバルに、またはクラス単位で定義し直すことができます。 オーバーロードされた演算子は、関数として実装されます。
オーバーロードされた演算子の名前は、operator
x です。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
このセクションの内容
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示