前言
自增、自减运算符有前置(++x
)和后置(x++
)之分,为了对其进行区分,C++规定:
- 前置运算符作为一元运算符进行重载:(注意T1对象和T2对象是有差异的)
- 后置运算符作为二元运算符重载,多写一个没用的参数:
Code
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string.h>
using namespace std;
class CDemo{
private:
int n;
public:
CDemo(int i = 0): n(i) {}
~CDemo(){}
CDemo(){}
operator int (){ return n; } //为能将对象直接传递给构造函数而不调用复制构造函数,省去开销
//写在class体内时:参数个数 = 运算符目数 - 1
CDemo& operator ++ (); //重载前置++
CDemo operator ++(int); //重载后置++
//--写在外面(本质一样)
friend CDemo& operator -- (CDemo&);
friend CDemo operator -- (CDemo&, int);
};
CDemo& CDemo :: operator ++ (){
n += 1;
return *this;
}
CDemo CDemo :: operator++(int){
CDemo tmp(*this);
n += 1;
return tmp;
}
CDemo& operator -- (CDemo &a){
a.n -= 1;
return a;
}
CDemo operator -- (CDemo &a, int){
CDemo tmp(a);
a.n -= 1;
return tmp;
}
int main(){
CDemo d(5);
cout << d ++ << ",";
cout << d << ",";
cout << ++ d << ",";
cout << d << endl;
cout << d -- << ",";
cout << d << ",";
cout << -- d << ",";
cout << d << endl;
return 0;
}
总结Tips
- 从重载函数的实现中也可以看到,前置运算本质上返回的原对象自增(减)后的自身引用。
- 而后置运算返回的是原对象的一个深拷贝副本(这个副本的数据展现了原对象自增(减)前的内容),因此多创建了一个对象。
因此++ x
可能会比x ++
在时空开销上更小,从而更高效。