為了編譯器區分前置和後置++,c++規定字尾形式有乙個int型別引數 ,當函式被呼叫時,編譯器傳遞乙個0做為int引數的值給該函式。不這樣規定,無法區分,因為都僅以自身物件為入參。
下面是乙個簡單的例子:
class cint ;
cint & cint:: operator ++ ( ) // 前置的是沒有引數的,並且返回引用
const cint cint::opeartor ++ (int) // 後置的有乙個匿名引數,並且返回const值
上面的實現解釋了乙個關鍵問題:前置比後置效率高 ,後置需要構造臨時物件並返回。
那為什麼前置和後置返回引數不同呢?
前置僅僅是對自身進行運算,並將自身返回,這樣外面可以直接對這個返回物件再進行操作 ,如(++it)->function()。
後置因其返回的不是原來的物件,此時再進行額外操作,改變的是臨時物件的狀態,並不異義 ,容易誤解。
那為什麼不返回const &呢?因為不能這麼做,返回引用將無效,臨時物件已經不存在了。
所以後置返回const 物件即限制對此臨時物件進行誤操作,並顯式地告訴呼叫者此物件僅為原物件的副本。
另外還有乙個原因:內建int型別並不支援 i++++ .而如果後置++返回乙個可修改的副本將與內建int型別行為不同。故應該禁止使用者對返回值進行修改。
前置 為什麼比後置 效率高
前置 type operator 後置 const type operator int 為了編譯器區分前置和後置 c 規定字尾形式有乙個int型別引數 當函式被呼叫時,編譯器傳遞乙個0做為int引數的值給該函式。不這樣規定,無法區分,因為都僅以自身物件為入參。下面是乙個簡單的例子 class cin...
前置 為什麼比後置 效率高
前置 type operator 後置 const type operator int 為了編譯器區分前置和後置 c 規定字尾形式有乙個int型別引數 當函式被呼叫時,編譯器傳遞乙個0做為int引數的值給該函式。不這樣規定,無法區分,因為都僅以自身物件為入參。下面是乙個簡單的例子 class cin...
為什麼前置 比後置 的效率高
僅對類型別而言,請看 class a a const a a a a operator 前置版本prefix const a operator int 後置版本postfix private int m i int tmain int argc,tchar argv 輸出 a的建構函式 a的拷貝建構...