运算符重载(三)

我们知道运算符重载函数可以选择两种形式(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 }
原文地址:https://www.cnblogs.com/cplinux/p/5651850.html