重载运算符

通常重载运算符用成员函数或友元函数,它们的关键区别在于:成员函数具有this指针,而友元函数没有this指针。
用成员函数重载运算符的语句格式为:
类型 类名::operator op(参数表)
{
//相对于该类定义的操作
}
一、一元与二元运算符
1.一元运算符
一元运算符不论前置还是后置,都要求有一个操作数:
object op 或 op object
当重载为成员函数时,编译器解释为:object.operator op()
函数operator op所需的操作数由对象object通过this指针隐含传递,所以参数表为空。
当重载为友元函数时,编译器解释为:operator op(object)
函数operator op所需的操作数由参数表的参数object提供。
2.二元运作符
任何二元运算符都要有左、右操作数:
objectL op objectR
当重载为成员函数时,编译器解释为:
objectL.operator op(objectR)
左操作数由对象objectL通过this指针传递,右操作数由参数objectR传递。
当重载为友元函数时,编译器解释为:
operator op(objectL,objectR)
左右操作数都由参数传递。
二、用成员函数或友元函数重载运算符
1.用成员函数重载运算符
当一元或二元运算符的左操作数是该类的一个对象时,重载运算符函数一般定义为成员函数。
例如:

clas Mr
{Mr (int mx=0,int my=0,int mz=0);
Mr operator(Mr t);
Mr & operator=(Mr t);
//...
private:
int x,y,z;
};
//...
Mr Mr::operator+(Mr t)
{ Mr temp;
temp.x=x+t.x; //相当于temp.x=this->x+t.x
temp.y=y+t.y;
temp.z=z+t.z;
return temp;
}
Mr & Mr::operator++()
{x++;
y++;
z++;
return *this;//*this是引起调用函数的对象,它是运算符的左操作数。
}
//...
int main()
{ Mr a(1,2,3),b(1,2,3),c;
c=a+b;//a+b中,激活函数的对象是a,运算符右边的对象被作为参数传递给函数,
      //该式可以解析为:a.operator+(b)
//...

2.用友元函数重载运算符

class Complex {public:
Complex(int a)
{real=a;image=0;}
Complex(int a,int b)
{real=a;image=b;}
Complex operator+(Complex);
Private:
int real;
int image;
//...
};
int f()
{Complex z(1,2),k(3,4);
z=z+25;//正确 被解析为:z.operator+(25)
z=25+z;//错误 被解析为:25.operator+(z),其中整型值25不是Complex类对象,
       //无法驱动函数进行运算,在此,用成员函数重载的“+”运算符不具备运算交换性
      //如果用友元函数重载运算符,左、右操作数都由参数传递。
      //若重载形式为:friend Complex operator+(Comple,complete);
      //则表达式:25+z
      //被解释为:operator+(25,z) 完全正确
//...
}

你可能感兴趣的:(函数,对象,Class,指针)