我们为什么要重载运算符呢?
理由就是,我们C++语言中已经给出的运算符(包括算数运算符和逻辑运算符)只是针对C++语言中已经给定的数据类型进行运算,假如我们想要对我们的自定义数据类型进行运算的话,则需要重载运算符,我们可以把重载运算符理解成对已有的运算符的一种重新定义。
运算符重载有两种方式:重载为类的成员函数&重载为类的友元函数
1成员函数重载运算符
成员函数重载运算符的原型在类的内部
格式如下:
class 类名{
...
返回类型 operator 运算符(形参表)
//函数体
};
在类外定义成员运算符函数的格式为:
返回类型 类名::operator 运算符(形参表){
//函数体
}
运算符可以分为单目运算符和双目运算符。
1.1单目运算符
用成员函数重载运算符时,如果运算符是单目的,则参数表为空。因为这时操作数访问该重载运算符的对象本身的数据,该对象有this指针指向,所以参数表为空。
struct ti{
int a,b;
bool operator < (ti &y){
if(a !=y.a )return a <y.a ;
return b >y.b ;
}
``
重载双目运算符时,左边操作数是访问该重载运算符的对象本身的数据,有this指针指向,右边操作数通过成员运算符函数的参数指出。所以,此时成员运算符函数只有一个参数。
ti operator +(ti &x){
ti ans;
ans.a =a+x.a ;
ans.b =b+x.b ;
return ans;
}
1.3重载++,–运算符
现在C++能识别“++”,“–”运算符是前缀还是后缀的,他们是单目运算符。
类名 operator++()//前缀方式
类名 operator++(int)//后缀方式。“–”同理
ti operator++(){
++a;
++b;
return *this;
}
ti operator ++(int){
ti temp=*this;
++a;
++b;
return temp;
}
2友元函数重载运算符
用友元函数重载运算符时,因为友元运算符函数没有this指针,所以如果运算符时单目的,则参数表中有一个操作数,如果运算符时双目的,则参数表中有两个操作数。
格式如下:
friend <函数类型> operator <运算符> (<形参>)
{...}
friend <函数类型> operator <运算符> (<形参1>,<形参2>)
{...}
在重载输出输入运算符的时候,只能采用全局函数的方式(因为我们不能在ostream和istream类中编写成员函数),这里才是友元函数真正的应用场景
friend istream &operator>>(istream &in,ti &x){
in>>x.a>>x.b;
return in;
}
friend ostream &operator <<(ostream &out,ti &x){
out<<x.a<<" "<<x.b;
return out;
}