这两个操作符最直观的区别是:前置++先自增+1,然后取自增后的值运算;后置++是运算时取原先的值运算,然后自增+1。
效率方面前置++效率会高一些,建议使用。
那么这两个操作符在c++中实现时有哪些区别?
为了方便理解,可以看关于年月日中日期自增的一个例子;
class Date
{
public:
// 全缺省的构造函数
Date(int year = 1900, int month = 1, int day = 1):_year(year),_month(month),_day(day)
{}
// 析构函数
~Date() {}
int GetMonthDay(int year, int month) //获取某年某月的天数
{
static int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int day = days[month];
if (month == 2
&& ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
{
day += 1;
}
return day;
}
// 前置++ 返回值为引用,效率高
Date& operator++() {
_day++;
if (_day > GetMonthDay(_year, _month)) {
_day = 1;
_month++;
}
if (_month > 12) {
_month = 1;
_year++;
}
return *this;
}
// 后置++
Date operator++(int) {
Date tmp = *this;
++(*this);
return tmp;
}
private:
int _year;
int _month;
int _day;
}
从上面代码可以看到:
1.为了区分前置++和后置++这两个运算符重载,后置++重载函数多了一个int参数。
2.前置++ ,返回值为引用,效率高。
3.后置++是利用前置++来完成的,其中多了一步使用临时变量tmp保存当前变量this的值,然后对this自增,但是最终返回的是没有自增前的tmp保存的值,这样就能使变量在运算时先进行运算,运算完再自增的操作。开辟和释放这段临时空间都会损失效率。
同理可学得前置–和后置–:
// 前置--
Date& operator--() {
_day--;
if (_day <= 0) {
_month--;
if (_month <= 0) {
_year--;
_month = 12;
}
_day = GetMonthDay(_year, _month);
}
return *this;
}
// 后置--
Date operator--(int) {
Date tmp = *this;
--*this;
return tmp;
}