c++ - 在 C++ 中重载复合赋值运算符不会更改变量

标签 c++ class operator-overloading compound-assignment

为了更加熟悉 C++,我正在实现一个类来处理复数。

class Complex {
    private:
        double _real;
        double _imag;

    public:
        Complex();
        Complex(double real, double imag);
        Complex(const Complex& z);

        Complex operator+(const Complex& u) const;
        Complex operator+=(const Complex& u);
};

我已经重载了按预期工作的 + 运算符:

Complex Complex::operator+(const Complex& u) const {
    Complex z(_real + u._real, _imag + u._imag);
    return z;
}

u=1-2i
v=2-1i
u+v=3-3i

此外,我还想重载+=:

Complex Complex::operator+=(const Complex& u) {
    Complex z(_real + u._real, _imag + u._imag);
    return z;
}

然而,这并没有像预期的那样工作,u+=v 的结果是 u=1-2i。为什么会这样?

最佳答案

您的复合赋值运算符创建一个新对象 z 而不是更改原始对象。

像这样在类定义中声明运算符

Complex & operator+=(const Complex& u);

然后定义如下

Complex & Complex::operator+=(const Complex& u) {
    _real += u._real;
    _imag += u._imag;

    return *this;
}

运算符可以定义为非类友元函数。例如

class Complex {
    private:
        double _real;
        double _imag;

    public:
        Complex();
        Complex(double real, double imag);
        Complex(const Complex& z);

        Complex operator+(const Complex& u) const;
        friend Complex & operator+=(Complex &v, const Complex& u);
};
Complex & operator+=(Complex &v, const Complex& u)
{
    v._real += u._real;
    v._imag += u._imag;

    return v;
}

关于c++ - 在 C++ 中重载复合赋值运算符不会更改变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58507315/

相关文章:

c++ - 有没有办法获取正在运行或新打开的资源管理器窗口的IExplorerBrowser接口(interface),以便后续调用BrowseToXXX?

c++ - 在结构实例的 vector 上丢失指针,在结构中使用指针

c++ - 未处理的异常,传递对象?

c++ - 'const Obj' 和 'Obj &' 是怎么回事?

c++ - Windows/Winsock UDP 数据包被分组在一起?

c++ - 为什么tellp() 是一个非常量?

c++ - 访问堆成员和堆栈对象之间的性能差异?

c++ - 获取函数指针和类指针的函数?

c++ - 在类中为结构重载 operator=

c# - 在 C# 中重载函数调用运算符