運算子多載(三)

來源:互聯網
上載者:User

標籤:

我們知道運算子多載函數可以選擇兩種形式(1)成員函數形式   (2) 全域友元函數形式。那麼我們應該怎麼樣選擇呢?

首先按照文法規定有的運算子只能由成員函數重載的運算子,例如operator[],operator=。而有些運算子既可以用成員函數重載,也可以沖全域友元函數重載,例如:++ ,——,+,—,+=,—=等,像這種既可以用成員函數重載也可以用全域友元函數重載的運算子,我們建議用成員函數重載,因為這樣做強調了運算子和類的聯合,尤其是二元運算子重載時,當左側運算元是當前的對象時,運算子會工作的更好。

 

但是有時運算子左側的運算元是別的對象,這種情況通常出現在輸入輸出資料流運算子多載時,operator<<,operator>>。此時運算子左側是流對象,而不是當前的對象(當前對象就是調用運算子函數的對象),那麼此時就不能載用成員函數重載運算子了,因為成員函數重載的運算子,都是那種左側的運算元是當前對象的運算子。

程式碼範例:

 1 class IntArray{ 2      enum{size=5}; 3      int m[size]; 4 public: 5       IntArray(){ 6          memset(i,0,size*sizoef(*i)); 7       8        } 9       int& operator[](int index){10   11          if(index<0&&index>=size) exit(0);12           return i[index];13       }14 15      friend ostream& operator<<(ostream& out,const IntArray& aRef);//左側的運算元是流對象,因此不能用成員函數重載,只能用友元函數重載16      friend istream& operator>>(istream& in,const IntArray& aRef);17 };18 19 ostream& operator<<(ostream& out,const IntArray& aRed){20     for(int i=0;i<aRef.size;i++){21        out<<aRed.m[i];22        if(i!=size-1)23         out<<",";24      }25       out<<endl;26       return out;27 28 }29 30 31 istream& operator>>(istream& in,const IntArray& aRed){32 33      for(int i=0;i<aRef.size;i++)34          in>>aRef.m[i];35       return in;36 37 }

 

運算子多載(三)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.