超载 *用于复数的运算符(C )

Overloading * operator for complex numbers (C++)

本文关键字:运算符 用于 超载      更新时间:2023-10-16

因此,我被要求超载运算符以实现基本算术数字。我已经得到 , - 和=工作,但是即使我认为我有正确的逻辑,我似乎也无法工作。

我的代码怎么了?

#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;
}