1>为区别前置和后置运算符,需要在后置运算符函数中加参数“int”,虽然这个类型在此除了以示区别之外并不代表任何实际含义;
2>前置返回的是变量的引用,后置返回的是常量。所以++++c合法,而c++++不合法,这一点可以在VC 6.0和DEV C++中采用基本数据类型的++操作来验证;
3>为什么不让c++++也合法呢?如果要实现c++++合法,必须使后置返回变量或变量的引用。c++是先返回c值再+1,所以不可能返回c,那就只能先建立局部变量来保存c的初值,然后再返回局部变量(局部变量不允许返回引用),但返回了局部变量之后,如果再连着进行下一次++运算,参与运算的就是这个局部变量的值了,所以此时c++++其实等效与c++,也就没有存在的意义了。
#include <iostream>
using namespace std;
class Complex
{
friend ostream &operator<<(ostream &out, const Complex &c);
private:
int m_a;
int m_b;
public:
Complex();
Complex(int a, int b);
Complex operator++(int); //后置++,需要占位参数与前置++ 区分开
Complex &operator++(); //前置++
};
Complex::Complex()
{
}
Complex::Complex(int a, int b)
{
m_a = a;
m_b = b;
}
//重载后,调用'<<'能够直接输出一个复数形式
ostream &operator<<(ostream &out, const Complex &c)
{
out << c.m_a << " + " << c.m_b << "i";
return out;
}
//返回值是Complex类的对象,
Complex Complex::operator++(int) //后置++,不是引用,不能进行连续使用
{
Complex tmp = *this; //因为后置++ 是先使用再++,所以用对象tmp 记录自身++之前的情况,并返回tmp
this->m_a++;
this->m_b++;
return tmp;
}
//返回值是引用Complex类的对象
Complex &Complex::operator++() //前置++,是引用,方便进行连续使用
{
this->m_a++; //因为前置++ 是先++再使用,所以直接++,并返回自身
this->m_b++;
return *this;
}
int main()
{
Complex c(1, 2);
cout << c++ << endl;
cout << ++c << endl;
return 0;
}