C++ ++ と -- 演算子のオーバーロード

C++ 重载运算符和重载函数C++ 演算子のオーバーロードと関数のオーバーロード

インクリメント演算子(++)とデクリメント演算子(--)は、C++ 言語における2つの重要な単項演算子です。

以下のサンプルでは、インクリメント演算子(++)のオーバーロード方法を、前置と後置の両方の使い方を含めて示します。同様に、デクリメント演算子(--)のオーバーロードも試すことができます。

サンプル

#include <iostream> using namespace std; class Time { private: int hours; // 0 から 23 int minutes; // 0 から 59 public: // 必要なコンストラクタ Time(){ hours = 0; minutes = 0; } Time(int h, int m){ hours = h; minutes = m; } // 時刻を表示するメソッド void displayTime() { cout << "H: " << hours << " M:" << minutes <<endl; } // 前置インクリメント演算子(++)をオーバーロード Time operator++ () { ++minutes; // オブジェクトに 1 を加える if(minutes >= 60) { ++hours; minutes -= 60; } return Time(hours, minutes); } // 後置インクリメント演算子(++)をオーバーロード Time operator++( int ) { // 元の値を保存 Time T(hours, minutes); // オブジェクトに 1 を加える ++minutes; if(minutes >= 60) { ++hours; minutes -= 60; } // 元の値を返す return T; } }; int main() { Time T1(11, 59), T2(10,40); ++T1; // T1 に 1 を加える T1.displayTime(); // T1 を表示 ++T1; // T1 にもう 1 加える T1.displayTime(); // T1 を表示 T2++; // T2 に 1 を加える T2.displayTime(); // T2 を表示 T2++; // T2 にもう 1 加える T2.displayTime(); // T2 を表示 return 0; }

上記のコードをコンパイルして実行すると、次の結果が得られます。

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

注意点として、括弧内の int は、これが後置形式であることをコンパイラに示すためのものであり、整数を表すものではありません。

前置形式のオーバーロードは Check operator++() を呼び出し、後置形式のオーバーロードは operator++(int) を呼び出します。

サンプル (++ オーバーロード)

#include <iostream> using namespace std; class Check { private: int i; public: Check(): i(0) { } Check operator ++ () { Check temp; temp.i = ++i; return temp; } // 括弧内に int を入れて後置を表す Check operator ++ (int) { Check temp; temp.i = i++; return temp; } void Display() { cout << "i = "<< i <<endl; } }; int main() { Check obj, obj1; obj.Display(); obj1.Display(); // 演算子関数を呼び出し、その後 obj の値を obj1 に代入する obj1 = ++obj; obj.Display(); obj1.Display(); // obj を obj1 に代入してから、演算子関数を呼び出す obj1 = obj++; obj.Display(); obj1.Display(); return 0; }

実行出力結果は次のとおりです。

i = 0
i = 0
i = 1
i = 1
i = 2
i = 1

サンプル (-- オーバーロード)

#include <iostream> using namespace std; class Check { private: int i; public: Check(): i(3) { } Check operator -- () { Check temp; temp.i = --i; return temp; } // 括弧内に int を入れて後置を表す Check operator -- (int) { Check temp; temp.i = i--; return temp; } void Display() { cout << "i = "<< i <<endl; } }; int main() { Check obj, obj1; obj.Display(); obj1.Display(); // 演算子関数を呼び出し、その後 obj の値を obj1 に代入する obj1 = --obj; obj.Display(); obj1.Display(); // obj を obj1 に代入してから、演算子関数を呼び出す obj1 = obj--; obj.Display(); obj1.Display(); return 0; }

実行出力結果は次のとおりです。

i = 3
i = 3
i = 2
i = 2
i = 1
i = 2

C++ 重载运算符和重载函数C++ 演算子のオーバーロードと関数のオーバーロード

その他の拡張