C++ オーバーロード演算子とオーバーロード関数
C++ では、同じスコープ内の特定の関数と演算子に複数の定義を指定でき、それぞれ関数オーバーロードと演算子オーバーロード。
オーバーロード宣言とは、同じスコープ内で以前に宣言された関数またはメソッドと同じ名前を持つ宣言ですが、それらのパラメータリストと定義(実装)は異なります。
あなたが呼び出すとき、オーバーロード関数或オーバーロード演算子を呼び出すとき、コンパイラは使用するパラメータの型と定義内のパラメータの型を比較して、最適な定義を選択します。最適なオーバーロード関数またはオーバーロード演算子を選択するプロセスは、オーバーロード解決。
C++における関数オーバーロード
同じスコープ内で、機能が類似したいくつかの同名関数を宣言できますが、これらの同名関数の仮引数(パラメータの数、型、または順序を指します)は異なる必要があります。戻り値の型の違いだけで関数をオーバーロードすることはできません。
次の例では、同名の関数print()が異なるデータ型を出力するために使用されています:
例
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
整数为: 5 浮点数为: 500.263 字符串为: Hello C++
C++における演算子オーバーロード
C++ に組み込まれているほとんどの演算子を再定義またはオーバーロードできます。これにより、カスタム型で演算子を使用できるようになります。
オーバーロードされた演算子は特別な名前を持つ関数であり、関数名はキーワード operator とその後にオーバーロードする演算子記号で構成されます。他の関数と同様に、オーバーロード演算子には戻り値の型とパラメータリストがあります。
Box operator+(const Box&);
加算演算子を宣言して、2つの Box オブジェクトを加算し、最終的な Box オブジェクトを返します。ほとんどのオーバーロード演算子は、通常の非メンバー関数として定義することも、クラスのメンバー関数として定義することもできます。上記の関数をクラスの非メンバー関数として定義する場合、各操作で2つのパラメータを渡す必要があります。次のようになります:
Box operator+(const Box&, const Box&);
次の例では、メンバー関数を使用して演算子オーバーロードの概念を示しています。ここでは、オブジェクトがパラメータとして渡され、オブジェクトの属性はthis演算子を使用してアクセスされます。次のようになります:
例
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
Volume of Box1 : 210 Volume of Box2 : 1560 Volume of Box3 : 5400
オーバーロード可能な演算子/オーバーロード不可能な演算子
以下はオーバーロード可能な演算子のリストです:
| 二項算術演算子 | + (加算)、- (減算)、* (乗算)、/ (除算)、% (剰余) |
| 関係演算子 | == (等しい)、!= (等しくない)、< (小なり)、> (大なり)、<= (以下)、>= (以上) |
| 論理演算子 | || (論理OR)、&& (論理AND)、! (論理NOT) |
| 単項演算子 | + (正)、- (負)、* (ポインタ)、& (アドレス取得) |
| インクリメント・デクリメント演算子 | ++ (インクリメント)、-- (デクリメント) |
| ビット演算子 | | (ビットOR)、& (ビットAND)、~ (ビット反転)、^ (ビットXOR)、<< (左シフト)、>> (右シフト) |
| 代入演算子 | =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>= |
| メモリの確保と解放 | new, delete, new[ ] , delete[] |
| その他の演算子 | ()(関数呼び出し)、->(メンバーアクセス)、,(カンマ)、[](添え字) |
以下はオーバーロードできない演算子のリストです:
- .:メンバーアクセス演算子
- .*, ->*:メンバーポインタアクセス演算子
- :::スコープ演算子
- sizeof:サイズ演算子
- ?::条件演算子
- #:プリプロセッサ記号
演算子オーバーロードの例
以下にさまざまな演算子オーバーロードの例を示します。オーバーロードの概念をより深く理解するのに役立ちます。
| 番号 | 演算子と例 |
|---|---|
| 1 | 単項演算子のオーバーロード |
| 2 | 二項演算子のオーバーロード |
| 3 | 関係演算子のオーバーロード |
| 4 | 入出力演算子のオーバーロード |
| 5 | ++ および -- 演算子のオーバーロード |
| 6 | 代入演算子のオーバーロード |
| 7 | 関数呼び出し演算子 () のオーバーロード |
| 8 | 添え字演算子 [] のオーバーロード |
| 9 | クラスメンバーアクセス演算子 -> のオーバーロード |