C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のインクリメント(++)・デクリメント(--)演算子のオーバーロード徹底解説

C++には、インクリメント(++)とデクリメント(--)という2つの重要な単項演算子が用意されています。これらの演算子は、ユーザー定義クラスに対してオーバーロードすることで、オブジェクトを直感的に操作できるようになります。

次の例では、インクリメント演算子(++)を前置(prefix)後置(postfix)の両方の使い方に対応させてオーバーロードする方法を解説します。同様の方法で、デクリメント演算子(--)もオーバーロード可能です。

前置と後置の違い

前置演算子(++T)は、値をインクリメントした後の値を返します。一方、後置演算子(T++)は、インクリメントする前の元の値を返してからインクリメントを行います。

C++では、この2つを区別するために、後置演算子をオーバーロードする際はダミーのint引数を取るのが慣例となっています。引数の有無によって、前置と後置が自動的に判別される仕組みです。

サンプルコード

#include <iostream>
using namespace std;

class Time {
    private:
    int hours;
    int minutes;

    public:
    Time(int h, int m) {
        hours = h;
        minutes = m;
    }

    void display() {
        cout << "H: " << hours << " M:" << minutes << endl;
    }

    // 前置 ++ 演算子のオーバーロード
    Time operator++ () {
        ++minutes;              // 現在のオブジェクトをインクリメント
        if(minutes >= 60) {
            ++hours;
            minutes -= 60;
        }
        return Time(hours, minutes);
    }

    // 後置 ++ 演算子のオーバーロード
    Time operator++( int ) {
        Time T(hours, minutes);

        // 現在のオブジェクトをインクリメント
        ++minutes;

        if(minutes >= 60) {
            ++hours;
            minutes -= 60;
        }

        // インクリメント前の元の値を返す
        return T;
    }
};

int main() {
    Time T1(11, 59), T2(10, 40);

    ++T1;
    T1.display();
    ++T1;
    T1.display();

    T2++;
    T2.display();
    T2++;
    T2.display();
    return 0;
}

実行結果

このプログラムを実行すると、以下の結果が出力されます。

H: 12 M:0
H: 12 M:1
H: 10 M:41
H: 10 M:42

コードの解説

このサンプルでは、時刻を表すTimeクラスに対して++演算子をオーバーロードしています。分(minutes)が60以上になった場合は、時間(hours)を1つ進めて分を60減らすことで、時刻の繰り上がりを正しく処理しています。

前置版のoperator++()は、インクリメント後の新しいTimeオブジェクトを返します。一方、後置版のoperator++(int)は、まずインクリメント前の状態を一時オブジェクトTに保存しておき、インクリメント処理を行った後に、保存しておいた元の値を返す点がポイントです。

そのため、T2++を呼び出した直後に表示される値は、インクリメントが適用されるの時刻となっています。実行結果を見ると、++T1では即座に値が更新されているのに対し、T2++では1回遅れて値が反映されていることが確認できます。

デクリメント演算子(--)も、まったく同じ要領でoperator--()operator--(int)を実装することで、前置・後置の両方に対応させることができます。

  1. Pythonにインクリメント・デクリメント演算子はない?代わりの書き方を徹底解説

    この記事では、Pythonにおけるインクリメント(増加)とデクリメント(減少)の実装方法について詳しく解説します。Pythonには「++」「--」演算子が存在しないC言語やJava、JavaScriptなどの多くのプログラミング言語には、値を1だけ増減させるための前置・後置インクリメント演算子(++)やデクリメント演算子(--)が用意されています。しかし、Pythonにはこれらの演算子は存在しません。これは「明示的であることが暗黙的であるよりも良い(Explicit is better than implicit)」というPythonの設計思想によるもので、コードの可読性を重視するためです。と

  2. Pythonにインクリメント・デクリメント演算子はない?その理由と正しい使い方

    Pythonにインクリメント・デクリメント演算子は存在しない Pythonには、C言語などでおなじみの単項インクリメント演算子(++)やデクリメント演算子(--)が用意されていません。代わりに、値を1つ増やす場合は a += 1 を、1つ減らす場合は a -= 1 を使用します。 a += 1 # 値を1増やす(インクリメント) a -= 1 # 値を1減らす(デクリメント) これはPythonの設計思想によるものです。「同じことを実現する方法は1つに絞る」というZen of Python(Pythonの禅)の原則に沿い、複数の記法をあえて許容していません。 基本的な使用例 >>