演算子のオーバーロードOperator overloading

Operatorキーワードは、クラスのインスタンスに適用されるときに、演算子記号を指定する関数を宣言します。The operator keyword declares a function specifying what operator-symbol means when applied to instances of a class. これによって、演算子に複数の意味を与えます (つまり、"オーバーロード" します)。This gives the operator more than one meaning, or "overloads" it. コンパイラは、オペランドの型を検査することにより、演算子の異なる意味を区別します。The compiler distinguishes between the different meanings of an operator by examining the types of its operands.

構文Syntax

演算子演算子-symbol ( パラメーターリスト )type operator operator-symbol ( parameter-list )

解説Remarks

ほとんどの組み込み演算子の関数をグローバルに、またはクラス単位で定義し直すことができます。You can redefine the function of most built-in operators globally or on a class-by-class basis. オーバーロードされた演算子は、関数として実装されます。Overloaded operators are implemented as functions.

オーバーロードされた演算子の名前はoperator xです。ここで、 xは次の表に示す演算子です。The name of an overloaded operator is operator x, where x is the operator as it appears in the following table. たとえば、加算演算子をオーバーロードするには、 operator + という関数を定義します。For example, to overload the addition operator, you define a function called operator+. 同様に、加算/代入演算子をオーバーロードするには、 +=operator + = という関数を定義します。Similarly, to overload the addition/assignment operator, +=, define a function called operator+=.

再定義可能な演算子Redefinable Operators

演算子Operator NameName 種類Type
, コンマComma BinaryBinary
!! 論理 NOTLogical NOT 単項演算子Unary
!=!= 非等値Inequality BinaryBinary
% ModulusModulus BinaryBinary
%= 剰余代入Modulus assignment BinaryBinary
& ビット演算子 ANDBitwise AND BinaryBinary
& アドレス取得Address-of 単項演算子Unary
&& 論理積Logical AND BinaryBinary
&= ビットごとの AND 代入Bitwise AND assignment BinaryBinary
( )( ) 関数呼び出しFunction call
( )( ) キャスト演算子Cast Operator 単項演算子Unary
** 乗算Multiplication BinaryBinary
** ポインター逆参照Pointer dereference 単項演算子Unary
*=*= 乗算代入Multiplication assignment BinaryBinary
+ 加算Addition BinaryBinary
+ 単項プラスUnary Plus 単項演算子Unary
++ インクリメント1Increment 1 単項演算子Unary
+= 加算代入Addition assignment BinaryBinary
- 減算Subtraction BinaryBinary
- 単項マイナス符号Unary negation 単項演算子Unary
-- デクリメント1Decrement 1 単項演算子Unary
-= 減算代入Subtraction assignment BinaryBinary
-> メンバー選択Member selection BinaryBinary
->*->* メンバーへのポインター選択Pointer-to-member selection BinaryBinary
/ 除算Division BinaryBinary
/= 除算代入Division assignment BinaryBinary
< より小さいLess than BinaryBinary
<< 左シフトLeft shift BinaryBinary
<<= 左シフト代入Left shift assignment BinaryBinary
<= 以下Less than or equal to BinaryBinary
= 割り当てAssignment BinaryBinary
== 等式Equality BinaryBinary
> より大きいGreater than BinaryBinary
>= 以上Greater than or equal to BinaryBinary
>> 右シフトRight shift BinaryBinary
>>= 右シフト代入Right shift assignment BinaryBinary
[ ][ ] 配列インデックスArray subscript
^ 排他的 ORExclusive OR BinaryBinary
^= 排他的 OR 代入Exclusive OR assignment BinaryBinary
|| ビット演算子包含的 ORBitwise inclusive OR BinaryBinary
|=|= ビットごとの包括的 OR 代入Bitwise inclusive OR assignment BinaryBinary
|||| 論理和Logical OR BinaryBinary
~ 1 の補数One's complement 単項演算子Unary
deletedelete 削除Delete
新規new 新規New
変換演算子conversion operators 変換演算子conversion operators 単項演算子Unary

1単項インクリメント演算子とデクリメント演算子の2つのバージョンが存在します: 前置インクリメントと後置インクリメント。1 Two versions of the unary increment and decrement operators exist: preincrement and postincrement.

詳細については、「演算子のオーバーロードに関する一般的な規則」を参照してください。See General Rules for Operator Overloading for more information. さまざまなカテゴリのオーバーロードされた演算子に対する制約については、次のトピックを参照してください。The constraints on the various categories of overloaded operators are described in the following topics:

次のテーブルに示す演算子は、オーバーロードできません。The operators shown in the following table cannot be overloaded. この表には、プリプロセッサシンボル # および ## が含まれています。The table includes the preprocessor symbols # and ##.

再定義不可演算子Nonredefinable Operators

演算子Operator NameName
」を参照してください。. メンバー選択Member selection
.*.* メンバーへのポインター選択Pointer-to-member selection
:::: スコープ解決Scope resolution
? :? : 条件付きConditional
# プリプロセッサによる文字列への変換Preprocessor convert to string
## プリプロセッサによる連結Preprocessor concatenate

オーバーロードされた演算子は通常、コードに出現すると、コンパイラによって暗黙的に呼び出されますが、メンバーまたは非メンバー関数を呼び出すのと同じ方法で明示的に呼び出すことができます。Although overloaded operators are usually called implicitly by the compiler when they are encountered in code, they can be invoked explicitly the same way as any member or nonmember function is called:

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

Example

次の例では、 + 演算子をオーバーロードして2つの複素数を加算し、その結果を返します。The following example overloads the + operator to add two complex numbers and returns the result.

// 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

このセクションの内容In this section

参照See also

C++ の組み込み演算子、優先順位と結合規則C++ Built-in Operators, Precedence and Associativity
キーワードKeywords