2016-06-11 19 views
3

返品無効または自己参照?</p> <pre><code>struct Object { int x, y; void addtoall(int value){ x += value; y += value; }; Object& addtoall(int value){ x += value; y += value; return *this; }; }; </code></pre> <p>2つのメンバ関数の違いは何ですか?A:以下のクラスを考えると

私は自己への参照を返すことは、いくつかの演算子のオーバーロードのために必要であることを理解する(例えば:演算子+ =)が、演算子のオーバーロードを除く、それが必要なのか?そうでない場合、voidを返すのではなく、いつ自分自身への参照を返す必要がありますか?

私は、これはGoogleの-FUを経由して見つけることができれば謝罪、または非常に基本的な質問ですが、私は(試みるの不足のためではなく)を検索して正確に何を確認されませんでした。

+7

これは、「流暢なインターフェイス」の一部としてよく使用されるメソッドチェーンを可能にします。それらの用語は簡単にGoogleableです。 –

+0

ああ!連鎖を考えていない。 – WeRelic

+0

私は後世のための答えを受け入れる前にちょっと待っていますが、すばやく答えるとそれをクリアしてくれてありがとう皆さんに感謝します。 – WeRelic

答えて

4

2つのメンバ関数の違いは何ですか?

インスタンスへの参照を返す関数は、これは便利です、実際のユースケースに依存している場合

Object o; 
o.addtoall(5).addtoall(6).addtoall(7); 

のように呼び出されたときを連鎖させることができますが、多くの場合、いわゆるドメインを開発するために使用されます特定の言語構文です。

+0

それが言及する興味深いものになるだろう[_namedパラメータidiom_(https://en.m.wikibooks.org/wiki/More_C%2B%2B_Idioms/Named_Parameter)、そのような技術の使用の良い例。 – skypjack

3

私は(例えば:+ =演算子)自己への参照を返すことは、いくつかの演算子のオーバーロードのために必要であることを理解し

いいえ、そうではありません。 (私を含め)多くの人々は、そのような事業者が実際にそれが使用されている大多数のケースでコードを不明瞭そのvoid、最も顕著なのoperator=、チェーン(または式の再利用)を返すように宣言する必要があることを提唱します。私たちは(残念なことに)大会のためだけにそれを行います。

連鎖は何ですか?

std::string{"asdf"}.append(c1).append(c2) 

append returns string&を、当然:正確には何なの参照を返すことができるようにすることを意図しています。 (append({c1, c2})がより簡潔である)stringため穏やかに役立ちますが、それは(私たちはだけではなく、二回メソッドを呼び出す2つのint秒を追加することができますあなたの、など)他のほとんどの例では無意味です。

+1

+1あなたの_Noのために、私は標準をもう一度読み直さなければなりません。ありがとう、決してそれについて考えたことはありませんが、それは完全に意味があります。 – skypjack

関連する問題