天天看點

[C++再學習系列] 前置++與後置++

前置++: 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   ,如需轉載請自行聯系原作者

繼續閱讀