前++和後++的實現

  前置++: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類型行爲不同。故應該禁止使用者對返回值進行修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章