インクリメント演算子とデクリメント演算子のオーバーロード (C++)Increment and Decrement Operator Overloading (C++)

インクリメント演算子とデクリメント演算子は、それぞれに次の 2 種類のバリアントがあるため、特別なカテゴリに分類されています。The increment and decrement operators fall into a special category because there are two variants of each:

  • 前置インクリメントと後置インクリメントPreincrement and postincrement

  • 前置デクリメントと後置デクリメントPredecrement and postdecrement

オーバーロードされた演算子関数を記述する場合、これらの演算子の前置バージョンと後置バージョン用に別々のバージョンを実装すると便利です。When you write overloaded operator functions, it can be useful to implement separate versions for the prefix and postfix versions of these operators. 2つを区別するために、次の規則が確認されています。演算子のプレフィックス形式は、他の単項演算子とまったく同じように宣言されています。後置形式では、型の追加の引数を受け取り int ます。To distinguish between the two, the following rule is observed: The prefix form of the operator is declared exactly the same way as any other unary operator; the postfix form accepts an additional argument of type int.

注意

後置形式のインクリメント演算子またはデクリメント演算子にオーバーロードされた演算子を指定する場合、追加の引数は型である必要があります int 。他の型を指定するとエラーが生成されます。When specifying an overloaded operator for the postfix form of the increment or decrement operator, the additional argument must be of type int; specifying any other type generates an error.

次の例に、Point クラスに対して前置および後置のインクリメント演算子とデクリメント演算子を定義する方法を示します。The following example shows how to define prefix and postfix increment and decrement operators for the Point class:

// 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()
{
}

次の関数のヘッダーを使用すると、同じ演算子をファイル スコープで (グローバルに) 定義できます。The same operators can be defined in file scope (globally) using the following function heads:

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 後置形式のインクリメント演算子またはデクリメント演算子を示す型の引数は、通常、引数を渡すために使用されません。The argument of type int that denotes the postfix form of the increment or decrement operator is not commonly used to pass arguments. 通常は、値 0 が含まれます。It usually contains the value 0. ただし、次のように使用できます。However, it can be used as follows:

// 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.
}

上記のコードに示すように、明示的に呼び出すこと以外に、インクリメント演算子またはデクリメント演算子を使用してこれらの値を渡すための構文はありません。There is no syntax for using the increment or decrement operators to pass these values other than explicit invocation, as shown in the preceding code. この機能を実装するためのより簡単な方法は、加算/代入演算子 () をオーバーロードすることです +=A more straightforward way to implement this functionality is to overload the addition/assignment operator (+=).

関連項目See also

演算子のオーバーロードOperator Overloading