1. i++和++i和區別
i++; // i 的值作為返回值, i 自增 1;
++i; // i 自增1, i 的值作為返回值
- 在工程中,獨立的
i++;
和++i;
是沒有區別的,因為在沒有返回值的情況下,編譯器會對它們做優化處理,使得這兩條語句完全一樣。
2. 意想不到的事實
- 現代編譯器產品會對代碼進行優化
- 優化使得最終的二進制程序更加高效*
- 優化后的二進制程序丟失了C/C++的原生語義
-
不可能從編譯后的二進制程序還原C/C++程序——因編譯器對代碼進行優化后,其優化后的二進制程序丟失了C/C++的原生語義。
C/C++開發的軟件無法完全反編譯!!!
3. ++操作符的重載
- 全局函數和成員函數均可進行重載
- 重載前置++操作符不需要額外的參數
- 重載后置++操作符需要一個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()
{
Test t0(0);
cout << "t0.value() = " << t0.value() << endl;
Test t1 = ++t0;
cout << "t1.value() = "<< t1.value() << endl;
Test t2 = t0++;
cout << "t2.value() = " << t2.value() << endl;
return 0;
}
輸出結果
t0.value() = 0
t1.value() = 1
t2.value() = 1
4. 真正的區別—— ++i和i++的區別
- 對于基本類型的變量:前置++的效率與后置++的效率基本相同,可以根據項目組編碼規范進行選擇
- 對于類類型的對象:前置++的效率高于后置++,因此盡量使用前置++操作符提高程序效率
5. 小結
- 編譯優化使得最終的可執行程序更加高效
- 前置++操作符和后置++操作符都可以被重載
- ++操作符的重載必須符合其原生語義
- 對于基礎類型,前置++與后置++的效率幾乎相同
- 對于類類型,前置++的效率高于后置++