所谓运算符重载,就是运算符本身的功能不足以实现我们的目的,我们需要赋予运算符新的含义来满足需求。(重载的运算符必须与用户定义的自定义类型的对象一起使用,至少有一个参数不是c++标准类型中的,否则原有的功能已经很全,再重载毫无意义)
下面均用复数类举例:
class Complex{
private:
double real,imag ;
public:
Complex(){
real=0;imag=0;}
Complex(double r,double i){
real=r;imag=i;}
void display(){
cout<<"("<<real<<","<<imag<<")"<<endl;}
};
1.运算符重载的格式:
重载运算符的一般格式:
函数类型 operator 运算符名称 (形参表){ 对运算符的处理 }
说明:
运算符被重载后其原有功能仍被保留,还多了重载后可以实现的功能,系统会根据运算符前后的数据类型自动选择用哪个功能。
例:想让‘+’用于复数类的加法运算
class Complex{
private:
double real,imag ;
public:
Complex(){
real=0;imag=0;}
Complex(double r,double i){
real=r;imag=i;}
void display(){
cout<<"("<<real<<","<<imag<<")"<<endl;}
Complex operator + (Complex & c);
};
Complex Complex::operator + (Complex & c){
return Complex(real+c.real,imag+c.imag);
}
int main()
{
Complex c1(1,2),c2(3,4),c3,c4;
c3=c1+c2;
c4=c3+Complex(5,6);//临时对象
c3.display();
c4.display();
}
输出的结果均为(4,6)和(9,12)。
2.类的运算符重载有两种方式:
(1)重载为成员函数:
Complex operator + (Complex & c){
return Complex(real+c.real,imag+c.imag);
}
Complex c1(1,2),c2(3,4),c3;
c3=c1+c2;
c3.display();
(2)重载为友函数
friend Complex operator + (Complex & c1,Complex & c1){
return Complex(c1.real+c2.real,c1.imag+c2.imag);
}
Complex c1(1,2),c2(3,4),c3;
c3=c1+c2;
c3.display();
输出的结果均为(4,6)。
第一种是重载为成员函数,参数个数为运算符数目减一(因为可以通过this指针自由的访问本类的数据成员),第二种是重载为普通函数,参数个数为运算符目数,重载为友元函数是因为方便调用对象中的成员。
那么问题来了,什么时候用友元函数,什么时候用类成员函数?
首先我们来看在上面的例子中是c3=c1+c2;
,对于类成员函数的重载来说运算符两侧的参数必须是与运算符函数类型相同的类对象,如果我们想要让类的对象和其他数据类型的变量或常数相加,如c3=c2+1;
这时我们需要再次重载‘+’,因为之前重载的只能计算两个对象的加法。
Complex operator + (int & i){
return Complex(real+i,imag);
}
此时c3=c2+1;
便可以实现了。
那么c3=1+c2;
呢?显然是不行的,因为这个重载同样利用了类成员函数可以用this指针的便利,运算符左侧的参数