我读到将实现运算符作为友元函数会更好。当我已经有+运算符函数时,如何将+ =运算符作为友元函数重载:
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;
}
答案 0 :(得分:4)
将运算符重载为友元函数更好,以便允许转换应用于表达式的左侧和右侧。例如,string
的{{1}}是朋友,因此我可以写operator+
而不是只能写"Hello " + string("World")
。
但是,这种推理不适用于string("Hello ") + "World"
等变异器。你必须采用一个非const左参数,这就排除了能够在临时使用此运算符。因此,建议将非变异运算符实现为operator+=
(或其他free-)函数和mutator作为成员函数。 (实际上,friend
只能作为成员函数重载。)
答案 1 :(得分:1)
您还需要修改左值。
Dollar &operator+=(Dollar &p1, const Dollar &p2)
{
p1=p1+p2;
return p1;
}
答案 2 :(得分:0)
通常的方法是提供+=
作为成员函数,修改*this
并将+
实现为使用+=
的免费函数。