我们知道运算符重载函数可以选择两种形式(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 }