重载运算符有什么问题?

时间:2013-07-09 19:30:14

标签: c++ operator-overloading

我正在学习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());
}

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

1 个答案:

答案 0 :(得分:4)

问题是你正在尝试将临时绑定到非const引用,这是不允许的,没有任何意义:

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
}

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