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

式の左側と右側の両方に変換を適用できるようにするには、演算子をフレンド関数としてオーバーロードすることをお勧めします。たとえば、は友達stringoperator+ので、書ける"Hello " + string("World")だけではなく、書けるようになりますstring("Hello ") + "World"

ただし、この推論は などのミューテーターには適用されませんoperator+=。const 以外の左引数を取る必要があるため、一時的にこの演算子を使用できなくなります。このため、変更しない演算子を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 に答える