当我们重载了++这个自增运算符,那么在调用他的时候,编译器如何知道我们是调用了前缀自增还是后缀自增呢
#include <iostream>
using namespace std;
class tmp
{
private:
int a;
public:
tmp(int b) { a = b; }
tmp& operator++(); //这是前缀
const tmp operator++(int); //这是后缀
void show();
};
tmp& tmp::operator++()
{
this->a += 1;
return *this;
}
const tmp tmp::operator++(int)
{
tmp old = *this; //先拿到自增前的值
this->a += 1; //再自增
return old;
}
void tmp::show()
{
int i = 1;
cout << "++a\n"
<< ++a + i << endl;
cout << "a++\n"
<< i + a++ << endl;
}
int main()
{
int i = 1;
tmp a(1);
a.show();
}
输出结果
++a
3
a++
3
通过形参列表的int参数来区分前缀后缀,尽管这个int参数并没有用到
注意前缀返回的是对象的引用,后缀返回的是const对象
至于为什么是const,这是因为,我们应该尽量和内置类型的行为保持一致,例如int就不允许i++++的操作,如果不返回一个const,就会导致我们不期望的++++行为发生