C++ でoperator
キーワードを使用して演算子に異なる動作を提供します。
基本概念#
- オペレータのオーバーロードにより、カスタムの動作が可能になります。
- オペレータのオーバーロードは、オペレータの固有の優先順位と結合性を変更しません。
operator
の構文#
type operator symbol(params)
ここで、type
は戻り値の型を示し、operator symbol
はオーバーロードする演算子を表します。例えば、加算演算子と加算代入演算子のオーバーロード形式は次のようになります:
// 加算
operator+
// 加算代入
operator+=
シンプルな例#
以下の例は、加算演算子のオーバーロードの方法を示しています:
class MyClass {
public:
MyClass(int val) : value(val) {}
// 加算演算子のオーバーロード
MyClass operator+(const MyClass& other) const {
return MyClass(value + other.value - 1);
}
int getValue() const {
return value;
}
private:
int value;
};
オーバーロードできない演算子#
C++ ではほとんどの演算子をオーバーロードすることができますが、コンパイラの実装の仕組みにより、以下の演算子はオーバーロードできません:
.
.*
::
?:
- 一部の非演算子
- sizeof
- typeid
- const_cast
- dynamic_cast
- static_cast
メンバ関数のオーバーロードとグローバル関数のオーバーロード#
- メンバ関数のオーバーロード:クラスのメンバ関数を使用して実装され、この場合、最初のパラメータは暗黙の
this
ポインタです。
class MyClass {
public:
MyClass(int val) : data(val) {}
// メンバ関数のオーバーロード
MyClass operator+(const MyClass& other) const {
return MyClass(data + other.data);
}
private:
int data;
};
- グローバル関数のオーバーロード:友達関数または通常の関数を使用して実装され、異なる型の 2 つのオブジェクトを操作する必要がある場合に使用されます。
class MyClass {
public:
MyClass(int val) : data(val) {}
// プライベートメンバにアクセスするために友達関数を宣言
friend MyClass operator+(const MyClass& lhs, const MyClass& rhs);
private:
int data;
};
// グローバル関数のオーバーロード
MyClass operator+(const MyClass& lhs, const MyClass& rhs) {
return MyClass(lhs.data + rhs.data);
}