C++入門之談前置++與后置++的區別
剛剛接觸C++的新手同學們,往往會被前置++和后置++搞混。這個概念在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::peartor ++ (Int) // 后置的有一個匿名參數,并且返回const值
- {
- CInt old = * this ;
- ++ ( * this );
- return old;
- }
上面的實現解釋了一個關鍵問題:前置比后置效率高 ,后置需要構造臨時對象并返回。
那為什么前置和后置返回參數不同呢?
前置僅僅是對自身進行運算,并將自身返回,這樣外面可以直接對這個返回對象再進行操作 ,如
- (++it)->function()
后置因其返回的不是原來的對象,此時再進行額外操作,改變的是臨時對象的狀態,并不異義 ,容易誤解。
那為什么不返回const &呢?因為不能這么做,返回引用將無效,臨時對象已經不存在了。
所以后置返回const 對象即限制對此臨時對象進行誤操作,并顯式地告訴調用者此對象僅為原對象的副本。
另外還有一個原因:內置int類型并不支持 i++++ .而如果后置++返回一個可修改的副本將與內置int類型行為不同。故應該禁止使用者對返回值進行修改。
希望通過以上內容的介紹,能夠幫助到你。