C++如何理解这段话

来源:百度知道 编辑:UC知道 时间:2024/05/25 20:46:12
重载复数运算符+时,采用下面友元函数声明:

friend Complex operator+(Complex &c1,Complex &c2);

为什么不能用于“实数+复数”?怎样改进才能适用?为什么?

答:使用引用类型变量作为运算符重载函数的参数,身为左值的实数类型实参不能被转换为复数,编译时无法通过。添加const说明,使实数到复数的转换隐式地在一份拷贝上进行,则可以实现“实数+复数”运算。修改后的说明为:

friend Complex operator+(const Complex &c1, const Complex &c2);

注意:Complex的构造函数中要有
Complex(double);
将重载复数运算符+函数修改为
friend Complex operator+(const Complex &c1, const Complex &c2);
后,运行程序

Complex c1(1.5,2.4);
Complex c2(c1-2.5);
cout<<c2<<endl;

运行结果:
-1+2.4i

系统将-2.5通过构造函数Complex(double);
转化为未命名的临时的Complex的const对象(因为-2.5为左值,不能修改)。
再将c1与新生成的 未命名的临时的Complex的const对象代入函数friend Complex operator+(const Complex &c1, const Complex &c2);
进行运算。

因为,修改前,无法按上述方式进行(const对象不能赋给非const引用),所以编译不通。
有不明白的地方,hi我!

呵呵,我也在复习这个哦。

比如说有:
Complex c2(1,5),c3;
c3=1.5+c2;

则处理1.5+c1时,系统发现和重载的函数
Complex operator+(Complex &c1,Complex &c2); 参数类型不匹配,身为左值的实数类型(这里是1.5)实参不能被转换为复数,编译时无法通过。
改成Complex operator+(const Complex &c1, const Complex &c2);后,系统会把1.5转换成复数(这个复数是一个无名的对象,又系统自动生成),然后这个无名的复数对象和c2就能用操作的“+”运算符相加,并把值赋给c3.