第14章 重载操作符与转换(6)
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的专栏
补充:软件开发 , C++ ,