前置++: type operator++();
後置++: const type operator++(int );
為了編譯器區分前置和後置++,C++規定字尾形式有一個int類型參數,當函數被調用時,編譯器傳遞一個0做為int參數的值給該函數。不這樣規定,無法區分,因為都僅以自身對象為入參。
下面是一個簡單的例子:
class CInt{
private:
int m_value;
//....
};
CInt & CInt::operator++( ) // 前置的是沒有參數的,并且傳回引用
{
this->m_value+=1;
return * this;
}
const CInt CInt::opeartor++(Int) // 後置的有一個匿名參數,并且傳回const值
CInt old = *this;
++(*this);
return old;
上面的實作解釋了一個關鍵問題:前置比後置效率高,後置需要構造臨時對象并傳回。
那為什麼前置和後置傳回參數不同呢?
前置僅僅是對自身進行運算,并将自身傳回,這樣外面可以直接對這個傳回對象再進行操作,如(++it)->function()。後置因其傳回的不是原來的對象,此時再進行額外操作,改變的是臨時對象的狀态,沒有意義,容易誤解。
那為什麼不傳回const &呢?因為不能這麼做,傳回引用将無效,臨時對象已經不存在了。是以後置傳回const 對象即限制對此臨時對象進行誤操作,并顯式地告訴調用者此對象僅為原對象的副本。
另外還有一個原因:内置int類型并不支援 i++++。而如果後置++傳回一個可修改的副本将與内置int類型行為不同。故應該禁止使用者對傳回值進行修改。
----------------------------------------------------
歡迎轉載,請注明作者和出處。
本文轉自 zhenjing 部落格園部落格,原文連結:http://www.cnblogs.com/zhenjing/archive/2010/11/18/1881051.html ,如需轉載請自行聯系原作者