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++ 演算子のオーバーロードと関数のオーバーロード