先上代码:
#include<iostream>
using namespace std;
class Test
{
public:
int a;
Test(int _a)
{
a = _a;
}
Test& operator++()
{
this->a++; //可简化为a++
return *this; //返回引用
}
Test operator++(int)
{
Test t = *this; //先记录当前结果
this->a++; //实际递增(可简化为a++)
return t;//返回原本值(返回副本值)
}
};
int main()
{
Test t1(1);
cout << (t1++++).a << endl;
cout << (t1).a << endl;
cout << (++++t1).a << endl;
cout << (t1).a << endl;
}
输出结果 1 2 4 4
Q:为什么前置递增返回引用,后置递增返回值
A:为了实现链式编程,即保证++++t1能得到想要结果,所以需要返回引用,保证一直在对同一个对象进行操作。
而后置递增返回值是因为后置递增是先用值再进行加操作,这样必须先用一个临时变量t来存储原本值,而c++不允许返回临时变量的引用,所以只能返回值。
Q:为什么t1++++后t1.a打印出来是1,而不是2
A:因为返回的是值,第二次并不是在原本t1上进行++。
分析:t1++++等同于(t1++)++,先看t1++,内部让t1的a值加1,然后返回一个新的Test类型数据,他是原本t1的一个副本。之后剩下的++符号变为了在新Test上进行操作。这个新Test假设名字为T,(t1++)++执行内部后等于T++。所以综上,t1实际只改变了一次。
Q:那么普通的int类型连续递增会怎么样
A:经过测试,int a=0;++++a可正常运行;a++++,直接报错,个人理解为由于后置递增只能返回值类型,没办法链式,强行a++++的话a值也之后改变一次,无意义,所以c++直接禁止我们这样。
Q:我不准备用链式的话前置递增可不可以也返回值
A:可以
以上为个人学习后的理解,有误欢迎指正