在 C++ 中重载复合赋值运算符不会更改变量
Overloading compound-assignment-operator in C++ does not change variable
为了更加熟悉 C++,我正在实现一个 class 来处理复数。
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
。为什么会这样?
首先赋值运算符应该return引用赋值。
其次,您的代码应该更改当前对象的值。
有几个解决方案:
Complex& Complex::operator+=(const Complex& u) {
*this = Complex(_real + u._real, _imag + u._imag);
return *this;
}
或
Complex& Complex::operator+=(const Complex& u) {
_real += u._real;
_imag += u._imag;
return *this;
}
您的复合赋值运算符创建了一个新对象 z 而不是更改原始对象。
在 class 定义中声明运算符,如
Complex & operator+=(const Complex& u);
然后定义如下
Complex & Complex::operator+=(const Complex& u) {
_real += u._real;
_imag += u._imag;
return *this;
}
运算符可以定义为非class友元函数。例如
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++,我正在实现一个 class 来处理复数。
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
。为什么会这样?
首先赋值运算符应该return引用赋值。
其次,您的代码应该更改当前对象的值。
有几个解决方案:
Complex& Complex::operator+=(const Complex& u) {
*this = Complex(_real + u._real, _imag + u._imag);
return *this;
}
或
Complex& Complex::operator+=(const Complex& u) {
_real += u._real;
_imag += u._imag;
return *this;
}
您的复合赋值运算符创建了一个新对象 z 而不是更改原始对象。
在 class 定义中声明运算符,如
Complex & operator+=(const Complex& u);
然后定义如下
Complex & Complex::operator+=(const Complex& u) {
_real += u._real;
_imag += u._imag;
return *this;
}
运算符可以定义为非class友元函数。例如
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;
}