インクリメントおよびデクリメント (C++)

それぞれの 2 種類のバリアントがあるためインクリメントデクリメント演算子は特別なカテゴリに分類されています:

  • Preincrement と postincrement

  • Predecrement と postdecrement

オーバーロードされた関数を記述する場合はプレフィックスの別のバージョンを実行しこれらの演算子のバージョンを後で追加すると便利な場合があります。2 は区別するには次の規則が確認されています : 演算子のプレフィックスのフォームは他の単項演算子と同じ方法で宣言されています ; 後置形式では型 int の追加の引数を受け取ります。

[!メモ]

オーバーロードされた演算子をインクリメントまたはデクリメント演算子の後置形式でに指定した場合は追加の引数は型である必要があります int; 他の種類を指定するとエラーが発生します。

次の例ではプレフィックスを定義し Point のインクリメントとデクリメント演算子を後で追加する方法について :

// increment_and_decrement1.cpp
class Point
{
public:
   // Declare prefix and postfix increment operators.
   Point& operator++();       // Prefix increment operator.
   Point operator++(int);     // Postfix increment operator.

   // Declare prefix and postfix decrement operators.
   Point& operator--();       // Prefix decrement operator.
   Point operator--(int);     // Postfix decrement operator.

   // Define default constructor.
   Point() { _x = _y = 0; }

   // Define accessor functions.
   int x() { return _x; }
   int y() { return _y; }
private:
   int _x, _y;
};

// Define prefix increment operator.
Point& Point::operator++()
{
   _x++;
   _y++;
   return *this;
}

// Define postfix increment operator.
Point Point::operator++(int)
{
   Point temp = *this;
   ++*this;
   return temp;
}

// Define prefix decrement operator.
Point& Point::operator--()
{
   _x--;
   _y--;
   return *this;
}

// Define postfix decrement operator.
Point Point::operator--(int)
{
   Point temp = *this;
   --*this;
   return temp;
}
int main()
{
}

同じ演算子はファイル スコープで次の関数ヘッダーの使用 (グローバル) を定義できます :

friend Point& operator++( Point& )      // Prefix increment
friend Point& operator++( Point&, int ) // Postfix increment
friend Point& operator--( Point& )      // Prefix decrement
friend Point& operator--( Point&, int ) // Postfix decrement

インクリメントまたはデクリメント演算子の後置形式のフォームを表示する型 int の引数は通常はない引数を渡すことができます。通常は値 0 が含まれます。ただし次のように使用できます :

// increment_and_decrement2.cpp
class Int
{
public:
    Int &operator++( int n );
private:
    int _i;
};

Int& Int::operator++( int n )
{
    if( n != 0 )    // Handle case where an argument is passed.
        _i += n;
    else
        _i++;       // Handle case where no argument is passed.
    return *this;
}
int main()
{
   Int i;
   i.operator++( 25 ); // Increment by 25.
}

前のコードに示すように明示的な呼び出しはこれらの値を渡すためにインクリメントまたはデクリメント演算子を使用するための構文はありません。この機能を実行する簡単な方法は加算代入演算子 (/)+= をオーバーロードすることです。

参照

関連項目

演算子のオーバーロード