2

我正在学习 C++(如果准确的话,重载运算符)。我尝试通过这种方式重载 operator+:

Complex4d Complex4d::operator+(const Complex4d &rvalue)
{
    return Complex4d(a() + rvalue.a(), b());
}

其中 rvalue.a() 和 a()、rvalue.b() 和 b() 是 Complex2d 的对象。在 Complex2d 类中,我也重载了 operator+,通过这种方式:

Complex2d Complex2d::operator +(Complex2d &rvalue)
{
    return Complex2d(a() + rvalue.a(), b() + rvalue.b());
} 

如果我写这个:

Complex4d Complex4d::operator+(const Complex4d &rvalue)
{
    Complex2d test = rvalue.a();
    return Complex4d(a() + test, b());
}

一切都好。我做错了什么?

4

1 回答 1

4

问题是您正在尝试将临时绑定到非常量引用,这是不允许的并且没有意义:

Complex2d Complex2d::operator +(Complex2d &rvalue)
                                ^^^^^^^^^^^
return Complex4d(a() + rvalue.a(), b());
                       ^^^^^^^^^^

要修复它,请使其采用 const 引用,可以将临时对象绑定到该引用。常量正确性也适用。如果您不修改它(您不应该修改它),请制作const.

Complex2d Complex2d::operator +(const Complex2d &rvalue)
                                ^^^^^

另一个参数 ( *this) 也没有被修改:

Complex2d Complex2d::operator +(const Complex2d &rvalue) const
                                ^^^^^                    ^^^^^                

同样,我建议让它们成为自由函数并重用其他代码:

Complex2d operator+(const Complex2d &lhs, const Complex2d &rhs) {
    auto ret = lhs;
    ret += rhs;
    return ret; //see comments for implementation reasoning
}

这允许左侧与右侧的行为相同,并通过减少一个不必要的函数来访问类的私有成员来改进封装。

于 2013-07-09T19:58:35.043 回答