前言
自增、自减运算符有前置(++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体内时:参数个数 = 运算符目数 - 1CDemo& 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 ++
在时空开销上更小,从而更高效。