...演算子のオーバーロード時に値または参照によって返されるときにいくつかのプラクティスがありますか?
はい、いくつかの標準形式found hereがあります。それらはすべて同じ形をしているわけではなく、オペレータによって異なります。一般的なアドバイスは組み込み型のセマンティクスに従うことです。すべての関数と同様に、(OPに示すように)ローカル変数への参照を返さないなど、一般的な規則が適用されます。
など。 (上記のリンクにある)質問の加算演算子を指定します。
class X
{
public:
X& operator+=(const X& rhs) // compound assignment (does not need to be a member,
{ // but often is, to modify the private members)
/* addition of rhs to *this takes place here */
return *this; // return the result by reference
}
// friends defined inside class body are inline and are hidden from non-ADL lookup
friend X operator+(X lhs, // passing lhs by value helps optimize chained a+b+c
const X& rhs) // otherwise, both parameters may be const references
{
lhs += rhs; // reuse compound assignment
return lhs; // return the result by value (uses move constructor)
}
};
operator+
値によって(しばしばfriend
のような)非加盟方法であり、復帰 - これはタイプに内蔵のセマンティクスに対応します。同様に、operator+=
はメンバメソッドであり、参照(更新版*this
)で返します。
...同じオブジェクト(*this
)を返すときに返される同じオブジェクトで参照されています。誰かが理由も説明できるのでしょうか?
戻り型により値である場合(X operator+
)、次いでreturn *this;
現在のオブジェクト(this
によって指されているもの)のコピーが作られ、返されることを意味します。
戻り型が副基準(X& operator+
)である場合、return *this;
(すなわちないコピー)現在のオブジェクト(this
によって指されているもの)への参照が返されることを意味します。
あなたはobj = obj1 + obj2 + obj3のようになります。 ? –
最初の例は間違っていますが、参照によってローカル変数を返しません。 – masterxilo