重载的实现方法就是定义一个函数,让这个函数来完成功能
运算符重载的实质其实就是函数重载,跟据参数类型、个数的不同,系统选择执行不同的函数
这样子的:
函数类型 operator 运算符名称(形参)
{函数体}
重载“+”,实现复数相加
#include <iostream>
using namespace std;
class Complex
{public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
Complex operator +(Complex &x);
void display();
private:
double real;
double imag;
};
Complex Complex::operator +(Complex &x)
{Complex c;
c.real=real+x.real;
c.imag=imag+x.imag;
return c;
}
void Complex::display()
{cout<<"("<<real<<","<<imag<<")"<<endl;
}
int main()
{Complex c1(3,4),c2(5,6),c3;
c3=c1+c2;
cout<<"c1=";c1.display();
cout<<"c2=";c2.display();
cout<<"c1+c2=";c3.display();
return 0;
}
这里这个重载函数是类的成员函数
“operator +”是一个整体,它就是函数名,我们这样说:函数operator +重载了运算符+
机器对c1+c2的理解,解释为 c1.operator +(c2),也就是以c2为参数,调用c1的operator +函数。
上面这个程序中,声明对象c3,c1+c2执行后会返回一个对象,这个对象赋值给了c3,所以c3.display()能得到正确的结果
编译系统根据表达式的上下文决定用那一个重载函数。
重载还是有一些个规则的:
只能对C++原本的运算符重载,不能自创;有5个运算符不能重载(sizeof、?:、::、. 、.* );操作数,优先级,结合性不能变;参数不能全是C++标准类型,至少得有一个是自定义的类对象;“=”和“&”不必重载。重载函数可以是成员函数、友元函数、也可以都不是。
上面那个是成员函数,它计算的时候,直接能调用c1的成员(对象c1)和参数c2的成员进行运算。
也可以是友元函数,这时,得这样:c.real=c1.real+c2.real;,是吧
class Complex
{public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
friend Complex operator +(Complex &x,Complex &y);
void display();
private:
double real;
double imag;
};
Complex operator +(Complex &x,Complex &y)
{Complex c;
c.real=x.real+y.real;
c.imag=x.imag+y.imag;
return c;
}
上面的函数可以更简便:
Complex operator +(Complex &c1,Complex &c2)
{return Complex(x.real+y.real,x.imag+y.imag);}
至于普通函数,它不能直接访问类的私有成员,所以不是很好用的
对于成员函数和友元函数的选择:
看成员函数,比如c1+c2,它以c2为参数,调用c1的成员函数,所以,用成员函数时,表达式的第一个参数是类对象,返回的也是类对象。
看友元函数,它就能处理i+c1这种形式,如
Complex operator +(int &1,Complex &c)
{return Complex(i+c.real,c.imag);}
在C++中,一般将单目运算符重载为成员函数,将双目重载为友元函数,(虽然友元的使用会破坏类的封装性)。
对“<<”和“>>”的重载:
#include <iostream>
using namespace std;
class Complex
{public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
Complex operator +(Complex &c2);
friend ostream & operator <<(ostream&,Complex&);
private:
double real;
double imag;
};
Complex Complex::operator +(Complex &c2)
{return Complex(real+c2.real,imag+c2.imag);
}
ostream& operator <<(ostream& output,Complex& c)
{output <<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
return output;
}
int main()
{Complex c1(2,4),c2(6,10),c3;
c3=c2+c1;
cout<<c3;
return 0;
}
对<< 和 >>重载的形式如下:
istream& operator >>(istream &,自定义类&);
ostream& operator <<(ostream&,自定义类 &);
注意参数,因为第一个参数是固定的,所以这两个只能做成友完函数或普通函数。
对cout<<c3;的解释,是operator <<(cout,c3);所以ostream& operator <<(ostream& output,Complex& c)中的output只是个形参,是被cout给替换了的。
然后,return output,现在知道实际是return cout,现cout的现状返回。
对>>的重载:
istream & operator >>(istream & input,Complex & c)
{cout<<"Input real and imag:";
input>>c.real>>c.imag;
return input;
}
评论