banner
Matrix

Matrix

Abyss
email
github

Petty C++ 演算子のオーバーロード

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);
}
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。