演算子のオーバーロード

 

Visual Studio 2017 RC の最新のドキュメントの詳細については、Visual Studio 2017 RC ドキュメントをご参照ください。

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

  
type operator operator-symbol ( parameter-list )  

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

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

再定義可能な演算子

演算子名前種類
,コンマ2 項
!論理 NOT単項
!=非等値2 項
%剰余2 項
%=剰余代入2 項
&ビットごとの AND2 項
&アドレス取得単項
&&論理 AND2 項
&=ビットごとの AND 代入2 項
( )関数呼び出し
( )キャスト演算子単項
*乗算2 項
*ポインター逆参照単項
*=乗算代入2 項
+加算2 項
+単項プラス単項
++インクリメント 1単項
+=加算代入2 項
減算2 項
単項マイナス符号単項
––デクリメント 1単項
–=減算代入2 項
–>メンバー選択2 項
–>*メンバーへのポインター選択2 項
/除算記号2 項
/=除算代入2 項
<より小さい2 項
<<左シフト2 項
<<=左シフト代入2 項
<=以下2 項
=代入2 項
==等価比較2 項
>より大きい2 項
>=以上2 項
>>右シフト2 項
>>=右シフト代入2 項
[ ]配列添字
^排他的 OR2 項
^=排他的 OR 代入2 項
&#124;ビットごとの包括的 OR2 項
&#124;=ビットごとの包括的 OR 代入2 項
&#124;&#124;論理 OR2 項
~1 の補数単項
deleteDelete
newNew
conversion operators変換演算子単項

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

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

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

再定義不可演算子

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

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

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  

  1. 演算子のオーバーロードに関する一般的な規則

  2. 単項演算子のオーバーロード

  3. 二項演算子

  4. 代入

  5. 関数呼び出し

  6. 添字演算子

  7. メンバー アクセス

C++ Operators
C++ キーワード

表示: