【C++】演算子オーバーロードの簡単な方法

【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;
    }
};

比較演算子のオーバーロード

==, !=, <, > などをオーバーロードできます。

代入演算子のオーバーロード

= のオーバーロードは特に注意が必要です。

添字演算子のオーバーロード

[] をオーバーロードすることで、配列のようなアクセスが可能になります。

関数呼び出し演算子のオーバーロード

() をオーバーロードすることで、オブジェクトを関数のように扱うことができます。

型変換演算子のオーバーロード

特定の型への変換を定義することができます。

演算子オーバーロードの注意点とベストプラクティス

演算子オーバーロードは強力ですが、適切に使用する必要があります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です