8.4.5 重载递增和递减运算符
本小节简要介绍在类中重载递增和递减运算符的机制,因为它们有一些区别于其他一元运算符的特性。我们需要一种方法来处理++和--运算符有前缀和后缀两种形式,而且结果取决于是前缀还是后缀。在本地C++(www.cppentry.com)中,对应于递增、递减运算符的前缀和后缀形式的重载运算符是不同的。例如,下面是在名为Length的类中定义这些运算符的方法:
- class Length
- {
- private:
- double len; // Length value for the class
-
- public:
- Length& operator++(); // Prefix increment operator
- const Length operator++(int);
// Postfix increment operator -
- Length& operator--(); // Prefix decrement operator
- const Length operator--(int);// Postfix decrement operator
-
- // rest of the class...
- }
这个简单的类认为长度只需要存储为double类型的数值。在现实中,我们也许需要定义更复杂的长度类,但此处的代码旨在说明如何重载递增和递减运算符。
区分重载运算符前缀和后缀形式的首要方法是利用形参列表。前缀形式没有形参,后缀形式有一个int类型的形参。后缀运算符函数的形参只是为了将其同前缀形式区别开来,除此之外它在函数实现中没有任何用处。
前缀形式的递增和递减运算符在操作数的值被用于表达式之前将其递增或递减,因此在当前对象被递增或递减之后,我们只需返回该对象的引用即可。下面是Lenth类的前缀operator++()函数的实现示例:
- Length& Length::operator++()
- {
- ++(this->len);
- return *this;
- }
而在后缀形式中,操作数是在其当前值被表达式使用之后递增或递减的。要实现这一点,需要在递增或递减当前对象之前创建当前对象的副本,并在修改过当前对象之后返回新创建的副本对象。下面是实现重载Lenth类的后缀++运算符的函数示例:
- const Length& Length::operator++(int)
- {
- Length length = *this; // Copy the current object
- ++*this; // Increment the current object
- return length; // Return the original copy
- }
复制了当前对象后,我们用类的++运算符递增它,然后返回当前对象原来未递增时的副本。将返回值声明为const,以防止类似data++++这样的表达式被编译。