前 和後 的實現

2021-06-03 00:22:03 字數 733 閱讀 1110

前置++:type operator++();

後置++:const type operator++(int );

為了編譯器區分前置和後置++,c++規定字尾形式有乙個int型別引數 ,當函式被呼叫時,編譯器傳遞乙個0做為int引數的值給該函式。不這樣規定,無法區分,因為都僅以自身物件為入參。

下面是乙個簡單的例子:

class  cint  ;

cint  &  cint:: operator ++ ( )  //  前置的是沒有引數的,並且返回引用

const  cint cint::opeartor ++ (int)  //  後置的有乙個匿名引數,並且返回const值

上面的實現解釋了乙個關鍵問題:前置比後置效率高 ,後置需要構造臨時物件並返回。

那為什麼前置和後置返回引數不同呢?

前置僅僅是對自身進行運算,並將自身返回,這樣外面可以直接對這個返回物件再進行操作 ,如(++it)->function()。

後置因其返回的不是原來的物件,此時再進行額外操作,改變的是臨時物件的狀態,並不異義 ,容易誤解。

那為什麼不返回const &呢?因為不能這麼做,返回引用將無效,臨時物件已經不存在了。

所以後置返回const 物件即限制對此臨時物件進行誤操作,並顯式地告訴呼叫者此物件僅為原物件的副本。

另外還有乙個原因:內建int型別並不支援 i++++ .而如果後置++返回乙個可修改的副本將與內建int型別行為不同。故應該禁止使用者對返回值進行修改。

java中的前 和後

直接po 和截圖 package com.test public class beforeandafterplus 執行結果如下 public static void main string args else 所以c最終是21 system.out.println c c int d 30 這裡是...

關於前 和後 的區別

關於前 和後 的區別,其實 很多人都清楚,比如 你知道i 是先用i,然後在讓i 1,然後 i是先對i 1,然後在去使用i。好了,這就是他們簡單的區別了,但是 實際上,i 呼叫了 i。說了這麼多i 和 i,我想你都應該頭暈了,給乙個例子吧 include class a a operator int ...

關於 前 和 後 的效率問題

我在寫這篇部落格之前也是被一些文章所誤導,認為 i的效率比i 的效率高,每次都是使用前置的 雖然操作沒錯,但是在認識上有錯誤,所以我把自己錯誤認識的經歷分享出來,希望能夠對和我有同樣錯誤的人一些幫助。對於計算機內建的資料型別,現在的編譯器水平比較高,比如 i和i 沒有任何的區別,我們可以通過檢視彙編...