概要
C++ のインクリメント(++)およびデクリメント(--)演算子はオーバーロードでき、カスタム型の操作に使用できます。これらの演算子をオーバーロードすることで、カスタム型により柔軟で直感的な動作を提供し、さまざまなシーンや要求に適合させることができます。
使用シーン
イテレータークラス
カスタムのイテレータークラスでは、インクリメントおよびデクリメント演算子をオーバーロードして、イテレーターの移動操作を実装できます。これらの演算子をオーバーロードすることで、イテレーターオブジェクトをポインターのように増分および減分できるようにし、イテレーターの使用を容易にします。
例
class Iterator {
private:
int* ptr { nullptr };
public:
Iterator(int* p) : ptr(p) {}
Iterator& operator++()
{
cout << "前置" << endl;
++ptr;
return *this;
}
// オーバーロード--
Iterator& operator--() {
--ptr;
return *this;
}
// オーバーロード++
Iterator& operator++(int){
cout << "後置" << endl;
auto ret = *this;
++ptr;
return ret;
}
// オーバーロード
int& operator*() {
return *ptr;
}
};
int main(int argc,char* args[])
{
int arr[] = {1, 2, 3, 4, 5};
Iterator it(arr);
++it;// 前置
//it.operator++();//前置
cout << *it << endl;
//it++;
it.operator++(0); // 後置
cout << *it << endl;
--it;
cout << *it << endl;
return 0;
}
カウンタークラス
カウンタークラスでは、インクリメントおよびデクリメント演算子をオーバーロードして、カウンターの増加および減少機能を実装できます。このようなクラスは、ループカウント、リソース管理など、さまざまなカウントシナリオに使用できます。
例
class Counter {
private:
int count;
public:
Counter(int c) : count(c) {}
Counter& operator++() {
++count;
return *this;
}
Counter& operator--() {
--count;
return *this;
}
int getCount() const {
return count;
}
};
int main() {
Counter cnt(0);
// カウント++
++cnt;
cout << cnt.getCount() << endl; // 1
// カウント--
--cnt;
cout << cnt.getCount() << endl; // 0
return 0;
}
カスタム整数型
カスタムの整数型に対して、インクリメントおよびデクリメント演算子をオーバーロードすることで、増減の動作を変更し、特定の要件により適合させることができます。たとえば、特定のステップを増加または減少させるように、カスタムの整数型を定義することができます。
イテレーター範囲クラス
カスタムのイテレーター範囲クラスでは、インクリメントおよびデクリメント演算子をオーバーロードして、範囲の移動操作を実装できます。このようなクラスは、範囲を表し、範囲内での移動機能を提供するために使用できます。
ステートマシンクラス
ステートマシンクラスでは、インクリメントおよびデクリメント演算子をオーバーロードして、ステートの変換操作を実装できます。このようなクラスは、ステートマシンを表し、異なるステート間の変換機能を提供するために使用できます。
前置インクリメント演算子(++i)と後置インクリメント演算子(i++)
後置インクリメント演算子は指摘できます。
Iterator& operator++(int);//後置インクリメント演算子
Iterator& operator--(int);//後置インクリメント演算子
例
class Iterator {
private:
int* ptr { nullptr };
public:
Iterator(int* p) : ptr(p) {}
Iterator& operator++()
{
cout << "前置" << endl;
++ptr;
return *this;
}
// オーバーロード--
Iterator& operator--() {
--ptr;
return *this;
}
// オーバーロード++
Iterator& operator++(int){
cout << "後置" << endl;
auto ret = *this;
++ptr;
return ret;
}
// オーバーロード
int& operator*() {
return *ptr;
}
};
int main(int argc,char* args[])
{
int arr[] = {1, 2, 3, 4, 5};
Iterator it(arr);
++it;// 前置
//it.operator++();//前置
cout << *it << endl;
//it++;
it.operator++(0); // 後置
cout << *it << endl;
--it;
cout << *it << endl;
return 0;
}