0

私は多くのチュートリアルを見てきましたが、stackoverflowで答えを見つけようとしましたが、成功しませんでした。演算子のオーバーロードC++参照または値

私には分かりません。オペレーターに過負荷をかけるときに、価値によって、または参照によって返されるときに、いくつかのプラクシスがありますか?

Class &operator+(){ 
    Class obj; 
    //... 
    return obj; 
} 

または同じことが、値によって

Class operator+(){ 
    Class obj; 
    //... 
    return obj; 
} 

そして、私は言及したいと思いますが、私は同じオブジェクト(*this)を返す例はほぼ90%で、あることに気付きました返された同じオブジェクトで参照されています。誰かが理由も説明できるのでしょうか?

+0

あなたはobj = obj1 + obj2 + obj3のようになります。 ? –

+0

最初の例は間違っていますが、参照によってローカル変数を返しません。 – masterxilo

答えて

2

...演算子のオーバーロード時に値または参照によって返されるときにいくつかのプラクティスがありますか?

はい、いくつかの標準形式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によって指されているもの)への参照が返されることを意味します。

+0

チェーンの追加をしたいのであれば、基本的に私は同じオブジェクトの参照を返す必要がありますか? *これだけを返す以外の違いはありませんか? –

+0

'* this'のコピーを作成します。 – Niall

1

operator+から参照によって返される最初のオプションは、参照によってローカルオブジェクトを返すため、間違っていますが、演算子関数本体が終了した後にローカルオブジェクトが存在しなくなるためです。一般:

  • 彼らは(によって:return *this;)変異したオブジェクト自身を返すので、参照することにより+=または-=リターンのような演算子を変異さ新しいオブジェクトをする必要があるため+または-よう
  • ノーマル演算子は、値で返す必要があります結果を保持するように構築する必要があります。
関連する問題