我正在学习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());
}
一切都好。我做错了什么?
答案 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
}
这允许左侧与右侧相同,并通过减少不必要的功能来访问类的私有成员来改进封装。