標籤:
我們知道運算子多載函數可以選擇兩種形式(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 }
運算子多載(三)