为何类型转换无法在+=运算符中生效?OOP考试练习遇问题
问题分析与解决方案
错误原因
b += c报错的核心在于:+=运算符要求左操作数是可修改的左值,而你的doble类到double的类型转换会生成一个临时的double值——这个临时值是右值,无法被+=修改(因为内置+=的参数是左值引用)。编译器不会自动完成“将b转成double、与c转成的double相加、再把结果转回doble对象赋值给b”的完整流程,因为没有对应的operator+=重载,且自定义类型不能直接复用内置运算符的逻辑。
符合要求的解决办法
既然题目禁止重载运算符和使用友元,我们可以把b += c替换为b = b + c,具体逻辑如下:
b + c会触发两次类型转换:b和c分别被转换为double,执行内置加法得到double结果;b = 上述double结果会调用你定义的doble(double)构造函数,将double值转换为doble临时对象,再通过编译器自动生成的默认拷贝赋值运算符赋值给b(题目仅禁止重载赋值运算符,默认生成的属于编译器行为,不在限制范围内)。
修改后的完整代码:
#include <iostream> using namespace std; class doble { public: doble(double D):d(D){} inline operator double(){return d;} private: double d; }; int main() { doble a = 1.5, b = 10.5; doble c = 5.25, d = c; cout << c / d * b + b * c - c * c / b + b / c << endl; //65 d = a = b = b + c; // 替换原有的b += c cout << d <<" "<< a <<" "<< b <<" "<< c << endl; //15.75 15.75 15.75 5.25 }
这段代码可以正常编译并输出预期结果,完全满足题目限制条件。
内容的提问来源于stack exchange,提问作者Angel Morales Romero
相关产品推荐
相关产品推荐

