LoginSignup
1
0

OperatorのOverLoad インクリメント(++)およびデクリメント(--)演算子

Posted at

概要

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;
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0