我读到将操作符实现为友元函数会更好。当我已经有+ operator函数时,如何重载+= operator作为友元函数:
friend Dollar operator+(const Dollar &p1, const Dollar &p2);
friend Dollar &operator+=(const Dollar &p1, const Dollar &p2);
这是错误的,因为我需要返回对变量的引用。
Dollar &operator+=(const Dollar &p1, const Dollar &p2)
{
return p1+p2;
}
将操作符重载为友元函数更好,以便允许转换同时应用于表达式的左右两侧。例如,string
的operator+
是朋友,所以我可以写"Hello " + string("World")
,而不是只能写string("Hello ") + "World"
。
然而,这个推理并不适用于像operator+=
这样的突变体。必须接受一个非const左实参,这就排除了在临时对象上使用此操作符的可能性。出于这个原因,建议将非变异操作符实现为friend
(或其他自由)函数,将变异操作符实现为成员函数。(实际上,operator=
只能作为成员函数重载)
还需要修改左值
Dollar &operator+=(Dollar &p1, const Dollar &p2)
{
p1=p1+p2;
return p1;
}
通常的方法是将+=
作为修改*this
的成员函数提供,并将+
作为使用+=
的自由函数实现。