• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 195,  comments - 30,  trackbacks - 0

            在模板類中輸入流“》”和輸出流“《”的重載,若使用友元在類內聲明,在類外實現,那么連接時將會報錯,但我們可以采用以下三種方式來實現輸出流"<<"和"輸入流>>"的重載。

            一、將輸出流"<<"和"輸入流>>"重載的實現寫在類中

            #include "stdafx.h"
            #include   <iostream>
            using   namespace   std;  
               
            template<class T>  
            class Test  
            {  
               public:  
                  Test(const T& t):data(t){}
                  //---------------------------------------------
                  friend ostream& operator<<(ostream& out,Test<T>& t)    //輸出流重載聲明及實現
                  {
                       return out<<"data   is   "<<t.data;
                  } //--------------------------------------------
                  friend istream& operator>>(istream& in,Test<T>& t)      //輸入流重載聲明及實現
                  {
                      return in>>t.data;
                  }//---------------------------------------------
               private:  
                  T data;  
            };//-----------------------------------------------------------------      
                  
            int   main()  
            {  
               Test<int> b(3);  
               cout<<b<<'\n';  
               cin>>b;
               cout<<b<<'\n';
               return 0;
            }

            那么輸入輸出流重載為什么不能在類內聲明,類外實現呢??因為模板比較特殊,若果在模板類外實現重載的話:

            template<class T>
            ostream& operator<<(ostream& out,Test<T>& t)
            {
                    return out<<"data   is   "<<t.data;
            } //--------------------------------------------

            上面正好是函數模板的定義,而我們知道操作符重載函數不是類的成員函數,因此此處相當于定義了一個新的函數模板(不同于類中的friend ostream& operator<<(ostream& out,Test<T>& t) )。但若去掉template<class T> ,函數中的參數Test<T>就不知是什么類型,所以不能在模板類內聲明,類外實現操作符重載。

            二、既然類外實現相當于重定義了一個函數模板,那么只要他不使用類的私用成員即可,因此重載的函數模板只有通過類的公有成員函數來實現對類的私有成員的操作,這樣不必在類內聲明它為友元,直接在類外重載即可。

            #include "stdafx.h"
            #include   <iostream>
            using   namespace   std;  
               
            template<class T>  
            class Test  
            {  
               public:  
                  Test(const T& t):data(t){}
                  T GetData()const{return data;}
                  void SetData(T &item){data=item;}
               private:  
                  T data;  
            };//-----------------------------------------------------------------
            template<class T>      
            ostream& operator<<(ostream& out,Test<T>& t)   
            {
                  return out<<"data   is   "<<t.GetData();
            } //--------------------------------------------
            template<class T>
            istream& operator>>(istream& in,Test<T>& t)     
            {
                 T item;
                in>>item;
                t.SetData(item);
                return in;
            }//---------------------------------------------      
            int   main()  
            {  
               Test<int> b(3);  
               cout<<b<<'\n';  
               cin>>b;
               cout<<b<<'\n';
               return 0;
            }  

            三、使用過渡函數

            #include "stdafx.h"
            #include   <iostream>
            using   namespace   std;  
               
            template<class   T>  
            class   Test  
            {  
               public:  
                  Test(const T& t):data(t){}
                  //---------------------------------------------
                  template<class CharT,class CharTraits>  
                  basic_ostream<CharT,CharTraits>& Output(basic_ostream<CharT,CharTraits>& out)const    //輸出流過渡函數
                  {
                        return out<<"data   is   "<<data;
                  } //--------------------------------------------
                  template<class   CharT,class   CharTraits>  
                  basic_istream<CharT,CharTraits>& Input(basic_istream<CharT,CharTraits>& in)    //輸入流過渡函數
                  {
                      return in>>data;
                  }//---------------------------------------------
               private:  
                  T data;  
            };//-----------------------------------------------------------------      
            template<class T,class CharT,class CharTraits>  
            basic_ostream<CharT,CharTraits>& operator<<(basic_ostream<CharT,CharTraits>& out,const Test<T>& t)   //輸出流重載
            {  
                return t.Output(out);  
            }//------------------------------------------------------------------      
            template<class T,class CharT,class CharTraits>  
            basic_istream<CharT,CharTraits>& operator>>(basic_istream<CharT,CharTraits>& in,Test<T>& t)   //輸入流重載
            {  
                return t.Input(in);  
            }//------------------------------------------------------------------      
            int   main()  
            {  
               Test<int>   b(4);  
               cout<<b<<'\n';  
               cin>>b;
               cout<<b<<'\n';
               return 0;
            }

            posted on 2011-02-15 01:04 luis 閱讀(552) 評論(0)  編輯 收藏 引用
            <2011年2月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272812345
            6789101112

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产色综合久久无码有码| 久久久无码精品亚洲日韩按摩 | 麻豆久久久9性大片| 久久精品国产免费观看三人同眠| 一本久久a久久精品亚洲| 2022年国产精品久久久久| 久久这里只有精品视频99| 天天躁日日躁狠狠久久| 久久无码人妻精品一区二区三区| 亚洲国产精品无码久久久秋霞2| 9999国产精品欧美久久久久久| 亚洲中文字幕无码久久精品1| 一本大道加勒比久久综合| 亚洲欧美伊人久久综合一区二区| 久久精品一区二区影院| 97久久香蕉国产线看观看| 亚洲中文字幕无码一久久区| 99热成人精品免费久久| 国产精品久久久久久吹潮| 久久精品国产清自在天天线| 久久影院午夜理论片无码 | 99久久精品费精品国产| 久久男人Av资源网站无码软件| 久久人妻少妇嫩草AV蜜桃| 91久久成人免费| 91精品国产色综久久 | 久久99国产精一区二区三区| 国色天香久久久久久久小说| 久久91精品国产91| 亚洲精品国产自在久久| 色诱久久av| 欧美粉嫩小泬久久久久久久| 精品国产一区二区三区久久蜜臀| 国产精品久久久久影院色| 久久99国产精品久久久| 国产精品青草久久久久婷婷| 91精品国产高清久久久久久io | 亚洲乱亚洲乱淫久久| 国产成人久久久精品二区三区| 国产高潮国产高潮久久久91 | 久久久久久国产精品美女|