遞增和遞減 (C++)
遞增和遞減運算子會分成一種特殊類別,因為有兩種變體,每個:
Preincrement 和 postincrement
Predecrement 和 postdecrement
在撰寫多載的運算子函式時,就很有幫助實作不同版本的前置詞和後置兩個運算子的版本。為了區別這兩者之間,所觀察下列規則: 前置詞的形式運算子宣告完全相同的方式與其他任何一元 (unary) 運算子。 後置格式會接受一個額外的引數型別的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.
}
沒有任何的語法,以遞增或遞減運算子傳遞這些值,而不明確的引動過程,如前面的程式碼所示。實作這項功能的方法很簡單方法是多載加法/設定運算子 (+=)。