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)