在c語言中我們學習了前置操作符和後置操作符,比如++i,--i,i++,i--,由於++和--屬於同型別操作符,此處講解均以++作為模型。
首先問乙個問題,i++和++i有何區別?
i++就是先返回i的值然後再加1;++i則是先對i加1再返回i的值。這是一般的解釋。
工程中,在c/c++中單獨的兩條語句在編譯器編譯後並沒有任何區別,實現的彙編**是一樣的。
通過觀察彙編**發現確實沒有什麼區別,只有暫存器使用的不一樣。
所以說,現代編譯器會對**進行優化使得最終的二進位制程式更加高效,但是被優化後的**失去了操作符原有的語義,不再可能從編譯後的二進位制程式還原成原先的c/c++**,也就是說通過c/c++開發的軟體無法完全反編譯。
解釋了普通型別的前置、後置操作符後我們想想能不能對他們也進行不改變語義的過載呢?要是可以的話又該如何進行區分?
同樣的,++操作符也屬於內建操作符,所以可以進行過載,並且全域性函式和成員函式均可以進行過載,那麼如何區分呢?過載前置++時不需要任何額外的引數;過載後置++操作符需要乙個int型別的佔位引數。過載過程如下:
test& operator ++ ()
test operator ++ (int)
前置++過載,根據前置++的原義,應該先是將變數值自增後並返回這個物件,所以需要返回引用。
後置++區別就大了一些,首先是宣告形式上,它的返回型別不是乙個引用,並且引數列表多了個int型別的佔位引數用於區分,實現過程中使用了個區域性物件,為什麼使用區域性物件?因為根據後置++的原生語義是先返回自身再對值進行自增,由於是過載函式,所以就需要乙個臨時物件儲存當前物件,待變數值自增1後再返回這個臨時物件,由於是區域性變數,所以就不能返回引用。
所以,前置++操作符過載時效率更高,因為它不需要建立物件,不需要呼叫建構函式和析構函式,不需要占用空間。
如何使用?
test t(0);
test t1 = t++;
cout << t1.value() << endl;
test t2 = ++t1;
cout << t2.value() << endl;
看看輸出會是什麼?
答案正是我們想要的,說明我們的過載是成功的。
所以我們可以真正回答文章開始的提問了,i++和++i有何區別?
對於基礎型別的變數來說,前置++與後置++的效率基本相同,因為可能會經過編譯器的優化。
對於類型別的變數來說,前置++的效率高於後置++的效率,所以我們應該盡可能使用前置++來提高程式執行效率。
前置操作符和後置操作符
操作符可以被過載 全域性函式和成員函式均可以進行過載 過載前置 操作符不需要額外的引數 過載後置 操作符需要乙個int型別的佔位引數 來看乙個例子 include include using namespace std class test intvalue test operator test o...
區別前置 後置操作符
對於從c轉業者都知道 以 舉例 前置 累加後取出 後置 取出後累加在過載 操作符的時候,為了避免前置跟後置的區別,讓後置有乙個int的傳參。class upint public upint operator 前置 const upint operator int 後置upint i i 呼叫i.op...
40 前置操作符和後置操作符
下面的 有區別嗎?進入彙編 i i 的值作為返回值,i自增1 i i自增1,i的值作為返回值 include include using namespace std int main int value test operator 過載前置 操作符 test operator int 過載後置 操作...