【C++】演算子オーバーロードの簡単な方法
- 演算子オーバーロードとは
- 演算子オーバーロードの構文
- メンバー関数と非メンバー関数の使い分け
- 一般的な演算子のオーバーロード
- ストリーム演算子のオーバーロード
- インクリメント・デクリメント演算子のオーバーロード
- 比較演算子のオーバーロード
- 代入演算子のオーバーロード
- 添字演算子のオーバーロード
- 関数呼び出し演算子のオーバーロード
- 型変換演算子のオーバーロード
- 演算子オーバーロードの注意点とベストプラクティス
演算子オーバーロードとは
C++では、演算子(+、-、*、/ など)をクラスに対してカスタマイズすることができます。これを演算子オーバーロードと呼びます。通常の関数オーバーロードと同様に、演算子の動作をユーザー定義型に適用できるようになります。
演算子オーバーロードの構文
演算子オーバーロードは、特殊な関数を定義することで実現します。構文は次のようになります。
class クラス名 {
public:
戻り値の型 operator 記号 (引数リスト) {
// 演算の実装
}
};
メンバー関数と非メンバー関数の使い分け
演算子オーバーロードは、メンバー関数として定義することも、非メンバー関数(友達関数)として定義することもできます。
メンバー関数としてのオーバーロード
メンバー関数の場合、左辺のオブジェクトが `this` ポインタで渡されます。
class MyClass {
public:
MyClass operator+(const MyClass& other) const {
return MyClass(/* 計算結果 */);
}
};
非メンバー関数(友達関数)としてのオーバーロード
非メンバー関数の場合、引数として両方のオペランドを渡します。
class MyClass {
friend MyClass operator+(const MyClass& lhs, const MyClass& rhs);
};
一般的な演算子のオーバーロード
加算(+)、減算(-)、乗算(*)、除算(/)のオーバーロードの例を示します。
class Number {
int value;
public:
Number(int v) : value(v) {}
Number operator+(const Number& other) const {
return Number(value + other.value);
}
};
ストリーム演算子のオーバーロード
入力(>>)・出力(<<)演算子をオーバーロードするには、非メンバー関数として定義する必要があります。
#include <iostream>
class Point {
int x, y;
public:
Point(int a, int b) : x(a), y(b) {}
friend std::ostream& operator<<(std::ostream& os, const Point& p) {
os << "(" << p.x << ", " << p.y << ")";
return os;
}
};
インクリメント・デクリメント演算子のオーバーロード
前置・後置の両方の形式に対応する必要があります。
class Counter {
int value;
public:
Counter(int v) : value(v) {}
Counter& operator++() { // 前置
++value;
return *this;
}
Counter operator++(int) { // 後置
Counter temp = *this;
++value;
return temp;
}
};
比較演算子のオーバーロード
==, !=, <, > などをオーバーロードできます。
代入演算子のオーバーロード
= のオーバーロードは特に注意が必要です。
添字演算子のオーバーロード
[] をオーバーロードすることで、配列のようなアクセスが可能になります。関数呼び出し演算子のオーバーロード
() をオーバーロードすることで、オブジェクトを関数のように扱うことができます。
型変換演算子のオーバーロード
特定の型への変換を定義することができます。
演算子オーバーロードの注意点とベストプラクティス
演算子オーバーロードは強力ですが、適切に使用する必要があります。