40-前置操作符和後置操作符
值得思考的問題
下面的代碼有沒有區別?爲什麼?
i++; // i的值作爲返回值,i自增1
++i; // i自增1,i的值作爲返回值
【範例代碼】真的有區別嗎?
#include <iostream>
#include <string>
using namespace std;
int main(int argc, const char* argv[]) {
int i = 0;
i++;
++i;
return 0;
}
意想不到的事實
- 現代編譯器產品會對代碼進行優化
- 優化使得最終的二進制程序更加高效
- 優化後的二進制程序丟失了C/C++的原生語義
- 不可能從編譯後的二進制程序還原C/C++程序
【注意】C/C++開發的軟件無法完全反編譯。
【問題】++操作符可以重載嗎?如何區分前置++和後置++?
++操作符重載
++操作符可以被重載(--操作符一樣):
- 全局函數和成員函數均可進行重載
- 重載前置++操作符不需要額外的參數
- 重載後置++操作符需要一個int類型的佔位參數
【範例代碼】++操作符的重載
#include <iostream>
#include <string>
using namespace std;
class Test {
int mValue;
public:
Test(int i) {
mValue = i;
}
int value() {
return mValue;
}
Test& operator ++ () {
++mValue;
return *this;
}
Test operator ++ (int) {
Test ret(mValue);
mValue++;
return ret;
}
};
int main(int argc, const char* argv[]) {
Test t(0);
t++;
++t;
return 0;
}
真正的區別
對於基礎類型的變量:
- 前置++的效率與後置++的效率基本相同
- 根據項目編碼規範進行選擇
對於類類型的對象:
- 前置++的效率高於後置++
- 儘量使用前置++操作符提高程序效率