C++运算符重载问题
最近学C++遇到个有趣的问题,看如下代码
#include<iostream.h>
class Complex
{
public:
Complex(){real=0;image=0;}
Complex(double r)
{
real=r;
image=0;
}
Complex(double r,double i)
{
real=r;
image=i;
}
friend Complex operator + (Complex c1,Complex c2);
void display();
private:
double real;
double image;
};
Complex operator + (Complex c1,Complex c2)
{
return Complex(c1.real+c2.real,c1.image+c2.image);
}
void Complex::display()
{
cout<<"("<<real<<","<<image<<"i)"<<endl;
}
int main(void)
{
Complex c1(3,4),c2(5,-10),c4,c3;
c4=c1+c2;
c3=c1+2.5;
c3.display();
c4.display();
return 0;
}
运行没有错误,可是如果改成
#include<iostream.h>
class Complex
{
public:
Complex(){real=0;image=0;}
Complex(double r)
{
real=r;
image=0;
}
Complex(double r,double i)
{
real=r;
image=i;
}
friend Complex operator + (Complex &c1,Complex &c2);
void display();
private:
double real;
double image;
};
Complex operator + (Complex &c1,Complex &c2)
{
return Complex(c1.real+c2.real,c1.image+c2.image);
}
void Complex::display()
{
cout<<"("<<real<<","<<image<<"i)"<<endl;
}
int main(void)
{
Complex c1(3,4),c2(5,-10),c4,c3;
c4=c1+c2;
c3=c1+2.5;
c3.display();
c4.display();
return 0;
}
编译后提示出错,出错位置在c3=c1+2.5上,提示想加的参数类型不符。这又是为什么呢?书上的例子有的在形参处加了取地址符,有的又没加,请问是什么原理。
[解决办法]
改变下friend函数的形参:
friend Complex operator + (const Complex &c1,const Complex &c2);
[解决办法]
friend Complex operator + (const Complex &c1,const Complex &c2);
CSDN又抽风了,回了一次,神秘消失了
[解决办法]
&这个是引用
c1+2.5实际上是调用了operator+(c1,2.5);
2.5会通过构造函数Complex(double)隐式构造出Complex对象。
但加上引用后,double则不能转换成Complex类型,编译报错。
[解决办法]
3楼正解。引用传值。