class Point
{
public:
Point &operator ++();
Point operator ++(int);
private:
int x;
};
Point& Point::operator ++()
{
x++;
return *this;
}
Point Point:: operator ++(int)
{
Point temp(*this);
x++;
return temp;
}
Point operator++() 和Point operator==(int) 的参数不同,只是为了区别前缀和后缀。
对于前缀++/-- ,我们只需要对其进行运算操作即可,直接返回其本身,用&接住它,所耗时间少一点。
对于后缀++/-- , 我们需要得到的是操作++/-- 之前的数并且成功++/--,因此我们需要创建一个临时对象temp,再对其自增/减的同时显示操作前的数,返回的是右值,主函数为临时对象。显然耗时比前缀自增耗时要多一点。
当我们尝试用复合运算时
int main()
{
int x;
cout << "请输入x=";
cin >> x;
Point p1(x),p2(p1);
cout << "(p2++)++的结果" << endl;
(p1++)++;
p1.show();
cout << "++(++p2)的结果" << endl;
(++(++p2));
p2.show();
return 0;
}
编译结果
为什么前者后缀自增得到结果是2呢?因为后缀重载中,返回的是临时变量,第一个自增得到的是2,但是第二个自增是对前一个临时变量自增,并不是p2,所以最后得到的还是2
后者,前缀重载返回的是该引用,对的是同一个对象自增。