2

我读到将运算符实现为友元函数会更好。当我已经有 + 运算符函数时,如何将 += 运算符重载为友元函数:

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;
}
4

3 回答 3

4

将运算符重载为友元函数更好,以便允许转换应用于表达式的左侧和右侧。例如,string'soperator+是一个朋友,所以我可以写"Hello " + string("World")而不是只能写string("Hello ") + "World"

但是,这种推理不适用于诸如operator+=. 您必须采用非常量的左参数,这会阻止能够在临时上使用此运算符。出于这个原因,建议将非可变运算符实现为friend(或以其他方式自由)函数,并将突变器实现为成员函数。(实际上,operator=只能作为成员函数重载。)

于 2013-05-31T21:28:11.003 回答
1

通常的方法是提供+=作为修改的成员函数*this+作为使用+=.

于 2013-05-31T23:13:15.053 回答
1

您还需要修改左值。

Dollar &operator+=(Dollar &p1, const Dollar &p2)
{
    p1=p1+p2;
    return p1;
}
于 2013-05-31T21:24:09.213 回答