乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C++中流操作符的重載

       博雅書屋lhs 2013-05-06
      ostream & operator << (ostream & output, const ClassType & object)
      {
          output << ...
          ...
          return output;
      }
      1. 返回類型為什么是引用?
      2. 第一個參數(shù)為什么用引用?
      3. 第二個參數(shù)為什么又是const引用?

      一個函數(shù)的定義,從返回類型到形參列表,我們都要有清晰的認識和理解,才能明白應該怎樣編寫這個函數(shù)。

      1. 返回引用是為了使得返回結(jié)果為左值,相當于一個獨立對象的作用,使我們可以做連續(xù)輸出的操作,例如
        1
        cout << object1 << object2 <<endl; 

        注意:返回引用要慎用,尤其是不能返回局部變量的引用,一般返回引用是針對當前對象返回 *this 或者返回const 類型的引用。

      2. 第一個參數(shù)之所以為引用,首先是避免了IO對象的復制,注意:這里不是刻意避免IO對象的復制,而是IO對象不可復制或賦值,所以這里必須用引用類型,不能傳遞流類型。由此我們應該知道,既然IO對象不支持復制或賦值,則一方面流對象不能存儲在vector或其它容器中(只有支持復制的類型才可以存儲vector等容器中);另一方面,形參或返回類型都不能為流類型(因為涉及復制),如果要傳遞或返回IO對象,則必須傳遞指向該流對象的指針或引用。此外,可能你會注意,為什么第二個參數(shù)為const類型,那第一個參數(shù)為什么不是const呢?ostream之所以為非const類型,很明顯,寫入流會改變流的狀態(tài),所以使用非const
      3. 第二個形參為const類型的引用,關(guān)于這樣形參的好處,在博文“美妙的const”中有詳細闡述。首先對于要輸出的類類型,避免了對象的復制;其次,一般輸出一個對象是不應該改變該對象的,故為const;再者,const引用可以使得傳遞參數(shù)更為靈活,例如,這樣定義,我們就可以使用同一個定義來傳遞輸出const和非const對象。關(guān)于const與非const對象的問題,參見博文美妙的const.
      4. 說到這里,順便提一下重載輸入流操作符,在輸入流操作符函數(shù)定義中,第二個參數(shù)則必須為非const,因為輸入流要改變該對象。

      綜上,這里面的每個細節(jié)都是必須的,不能更改。

      值得一提的是,重載流操作符函數(shù)必須為類的非成員函數(shù)。原因是,如果設定為成員函數(shù),則做操作數(shù)必然為該類的類對象,用法就變成了

      1
      object << cout

      這顯然與我們所要的相悖。說到這里就順便說一下為類設計重載操作符時候應該將其設置為類的成員函數(shù)還是非成員函數(shù),下面是我的總結(jié),僅供參考:

      • 必須為成員函數(shù)5個:賦值(=),下標符([ ]),調(diào)用符(( )),成員訪問箭頭符(->),“轉(zhuǎn)換函數(shù)”。前兩個比較常用,調(diào)用符重載即函數(shù)對象,箭頭符不太常見,指針類型類會用到;轉(zhuǎn)換函數(shù)則是用在“從”類類型到內(nèi)置類型的轉(zhuǎn)換時用到(標準轉(zhuǎn)換為內(nèi)置類型的轉(zhuǎn)換,類類型的轉(zhuǎn)換則分為“從”類類型的轉(zhuǎn)換和“到”類類型的轉(zhuǎn)換)
      • 建議為成員函數(shù)4個:復合賦值操作符,自增,自減,解引用;這幾個操作符是與類類型緊密相連的或改變對象狀態(tài)的操作符。
      • 必須為非成員函數(shù)1種:流操作符(輸入、輸出)
      • 建議為非成員函數(shù)4種:等等操作符,算術(shù)操作符,關(guān)系操作符,位操作符

      到這里吧,一個流操作符函數(shù)嘮叨了這么多,都是基礎,類似上面這些基礎知識,在《C++ primer》中都有涉及,而且分析的很好。

      下面說一點自己的感受吧,在學習一個新東西的時候,我們不能局限課本,有時間還是看看那些經(jīng)典的書籍,可以少走很多彎路,我體會最深的一點就是當時學習C++的“拷貝構(gòu)造函數(shù)”、“析構(gòu)函數(shù)”、“重載賦值運算符”時糾結(jié)了很長一段時間,記得那時往往析構(gòu)的時候編譯器總是彈框,還有什么深拷貝淺拷貝的問題,后來寫了很多程序廢了好大勁才覺得有點眉目,總結(jié)出來是如果類中有指針成員,就要注意上面的那些函數(shù)問題,是否需要定義自己的拷貝構(gòu)造和重載賦值運算符等等。

      后來看了《C++ primer》,當看到“復制控制”那一章時,記得當時真有種捶胸頓足的感覺,明明前人都總結(jié)的“經(jīng)驗三法則”在那里擺著,我卻不知道,如果早點看就不至于走那么多彎路了,而且自己總結(jié)出來的總有點山寨的感覺,所以經(jīng)典很重要,我們必須要學會“站在巨人肩膀上”,這樣也可以提高效率,加快進步。

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多