6. 自增、自减运算符重载

这一节讲解自增(++)和自减(--)运算符的重载。

自增运算符分为前置自增和后置自增运算,两个运算符同为一元运算符,C++ 编译器是为后置运算的重载函数添加一个 int 类型的参数来进行区分。

对于自减运算符也是如此,以下给出了这些运算符的重载的语法。

前置语法

class 类名{
   返回类型 operator++(void) {}
   返回类型 operator--(void) {}
}

后置语法

class 类名{
   返回类型 operator++(int) {}
   返回类型 operator--(int) {}
}

示例

以 Complex 类为例,以下设置规则,如果自增则实部自增,虚部不变。自减运算符也是如下。

// filename: incr_redu.cpp
#include <iostream>

using namespace std;

class Complex {
    public:
        Complex(double r=0, double i=0): real(r), image(i){}
        // 前置自增
        const Complex & operator ++() {
            real += 1.0;
            return *this;
        }
        // 前置自减
        const Complex & operator --() {
            real -= 1.0;
            return *this;
        }
        // 后置自增
        Complex operator ++(int) {
            Complex last_val(*this);
            real += 1.0;
            return last_val;
        }
        // 后置自减
        Complex operator --(int) {
            Complex last_val(*this);
            real -= 1.0;
            return last_val;
        }
    private:
        double real;
        double image;

    // 友元全局函数声明
    friend ostream & operator << (ostream & o, const Complex & c);
};

ostream & operator << (ostream & o, const Complex & c) {
    o << "(" << c.real << "+" << c.image << "i)";
    return o;
}

int main(int argc, char * argv[]) {
    Complex c1(1, 2);
    Complex c2;

    c2 = ++c1;
    cout << "c1:" << c1 << " c2:" << c2 << endl;
    c2 = c1++;
    cout << "c1:" << c1 << " c2:" << c2 << endl;
    c2 = --c1;
    cout << "c1:" << c1 << " c2:" << c2 << endl;
    c2 = c1--;
    cout << "c1:" << c1 << " c2:" << c2 << endl;

    return 0;
}

编译和运算结果如下

weimz@mzstudio:~$ g++ -o incr_redu incr_redu.cpp
weimz@mzstudio:~$ ./incr_redu 
c1:(2+2i) c2:(2+2i)
c1:(3+2i) c2:(2+2i)
c1:(2+2i) c2:(2+2i)
c1:(1+2i) c2:(2+2i)