14.7 自增操作符和自減操作符
1. 定義自增/自減操作符
C++語言不要求自增操作符或自減操作符一定作為類的成員,但是,因為這些操作符改變操作對象的狀態,所以更傾向於將它們作為成員。
2. 定義前自增/前自減操作符
為了與內置類型一致,前綴操作符應返回被增量或減量對象的引用。
class CheckedArr
{
public:
CheckedArr(int *b, int *e):beg(b),end(e),cur(b){}
CheckedArr &operator++()
{
if(end!=cur)
{
++cur;
return *this;
}
else
throw out_of_range("out of range");
}
CheckedArr &operator--()
{
if(beg!=cur)
{
--cur;
return *this;
}
else
throw out_of_range("out of range");
}
private:
int *beg;
int *end;
int *cur;
};
3. 區別操作符的前綴和後綴形式
後綴操作符函數接受一個額外的(即無用的)int型形參。這個形參不是後綴式操作符的正常工作所需要的,它的唯一目的是使後綴函數與前綴函數區別開來。
4.定義後綴式操作符
為了與內置操作符一致,後綴式操作符應返回舊值(即,尚未自增或自減的值),並且,應作為值返回,而不是返回引用。
CheckedArr operator++(int)
{
CheckedArr ret(*this);
++(*this);
return ret;
}
CheckedArr operator--(int)
{
CheckedArr ret(*this);
--(*this);
return ret;
}
因為通過前綴版本實現這些操作符,不需要檢查curr是否在范圍之內,那個檢查以及必要的throw,在相應的前綴式操作符中完成。
因為不使用int形參,所以沒有對其命名。
5. 顯式調用前綴式操作符
可以顯式調用重載操作符而不是將它作為操作符用在表達式中。如果想要使用函數調用來調用後綴式操作符,必須給出一個整型實參值。
所傳遞的值通常被忽略,但該值是必要的,用於通知編譯器需要的是後綴式版本。
一般而言,最好前綴式和後綴式都定義。只定義前綴式或只定義後綴式的類,將會讓習慣於使用兩種形式的用戶感到奇怪。
摘自 xufei96的專欄