重载+=操作符作为友元函数



我读到将操作符实现为友元函数会更好。当我已经有+ 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;
}

将操作符重载为友元函数更好,以便允许转换同时应用于表达式的左右两侧。例如,stringoperator+是朋友,所以我可以写"Hello " + string("World"),而不是只能写string("Hello ") + "World"

然而,这个推理并不适用于像operator+=这样的突变体。必须接受一个非const左实参,这就排除了在临时对象上使用此操作符的可能性。出于这个原因,建议将非变异操作符实现为friend(或其他自由)函数,将变异操作符实现为成员函数。(实际上,operator=只能作为成员函数重载)

还需要修改左值

Dollar &operator+=(Dollar &p1, const Dollar &p2)
{
    p1=p1+p2;
    return p1;
}

通常的方法是将+=作为修改*this的成员函数提供,并将+作为使用+=的自由函数实现。

最新更新