超载 *用于复数的运算符(C )
Overloading * operator for complex numbers (C++)
因此,我被要求超载运算符以实现基本算术数字。我已经得到 , - 和=工作,但是即使我认为我有正确的逻辑,我似乎也无法工作。
我的代码怎么了?
#ifndef COMPLEX_HPP
#define COMPLEX_HPP
#include <string>
class Complex
{
public:
Complex(double = 0.0, double = 0.0); // default constructor
Complex add(const Complex&) const; // function add
Complex subtract(const Complex&) const; // function subtract
Complex multiply(const Complex&) const; // function multiply
std::string toString() const; // return string representation
void setComplexNumber(double, double); // set complex number
void operator=(const Complex& obj)
{
(*this).realPart = obj.realPart;
(*this).imaginaryPart = obj.imaginaryPart;
}
Complex operator+(const Complex& obj)
{
Complex tmp_obj = *this;
tmp_obj.realPart = tmp_obj.realPart + obj.realPart;
tmp_obj.imaginaryPart = tmp_obj.imaginaryPart + obj.imaginaryPart;
return tmp_obj;
}
Complex operator-(const Complex& obj)
{
Complex tmp_obj = *this;
tmp_obj.realPart = tmp_obj.realPart - obj.realPart;
tmp_obj.imaginaryPart = tmp_obj.imaginaryPart - obj.imaginaryPart;
return tmp_obj;
}
Complex operator*(const Complex&obj)
{
Complex tmpObj = *this;
tmpObj.realPart = (tmpObj.realPart * obj.realPart) - (tmpObj.imaginaryPart * obj.imaginaryPart);
tmpObj.imaginaryPart = (tmpObj.realPart * obj.imaginaryPart) + (tmpObj.imaginaryPart * obj.realPart);
return tmpObj;
}
private:
double realPart;
double imaginaryPart;
};
开始覆盖tmpObj
(特别是tmpObj.realPart
)后,您就会丢失原始值。因此,请勿从tmpObj
中阅读,而是从*this
中阅读:
tmpObj.realPart = realPart * obj.realPart - imaginaryPart * obj.imaginaryPart;
// ^^^^^^^^ ^^^^^^^^^^^^^
tmpObj.imaginaryPart = realPart * obj.imaginaryPart + imaginaryPart * obj.realPart;
// ^^^^^^^^ ^^^^^^^^^^^^^
您对operator*()
的实现本质上是。
Complex operator*(const Complex&obj)
{
Complex tmpObj = *this;
tmpObj.realPart = (tmpObj.realPart * obj.realPart) - tmpObj.imaginaryPart * obj.imaginaryPart);
tmpObj.imaginaryPart = (tmpObj.realPart * obj.imaginaryPart) + (tmpObj.imaginaryPart * obj.realPart);
return tmpObj;
}
问题是第一个语句修改了tmpObj.realPart
,第二个语句的进行,就像尚未修改tmpObj.realPart
一样。
修复程序很简单:不要在作业的右侧使用tmpObj
。
Complex operator*(const Complex&obj)
{
Complex tmpObj; // your default constructor initialises to (0.0,0.0)
tmpObj.realPart = (realPart * obj.realPart) - (imaginaryPart * obj.imaginaryPart);
tmpObj.imaginaryPart = (realPart * obj.imaginaryPart) + (imaginaryPart * obj.realPart);
return tmpObj;
}
相关文章:
- 重载 std::字符串运算符+ 用于打印枚举名称
- 重载运算符 += 用于 C++ 中的链表
- 重载运算符 + 用于向量:命名空间标准
- 重载运算符 [] 用于从对象数组中给出特定索引
- 定义 ostream 运算符<<用于类中定义的 typedef
- C++运算符 = 用于具有类成员函数的数组
- 泛型运算符== 用于非 pod 对象
- 重载运算符<<用于数组,无需类
- 模板化 QDataStream 运算符<<用于枚举
- 重载运算符 = 用于铸造
- Ostream <<和运算符 -= 用于类?
- 重载运算符<用于多字段类
- 运算符<用于列表排序
- 重载 [ ] 运算符用于 C++ 中的 stl 映射
- 为什么我可以重载 istream 的运算符>>用于字符串?
- Push_front()用于矢量,运算符++用于贴图
- 重载运算符>>用于不区分大小写的字符串
- 重载运算符 = 用于类中的自定义类型
- 重载运算符<<用于嵌套类模板
- 正确重载 [括号] 运算符用于哈希表获取和设置