3

任意のクラスの>>演算子をオーバーロードする標準的な方法が、タイプistream(または任意の入力ストリーム)のオブジェクトを返す理由はありますか。

たとえば、このため、次のようなコード

y = (cin >> x) ;

は機能せず、オーバーロード>>に入力オブジェクトの戻り型がある場合は機能します。

4

3 に答える 3

2

たとえば、このため、次のようなコード

(cin >> x) = y;

動作しません。また、オーバーロード >> が入力オブジェクトの戻り値の型を持っていれば、そうなるでしょう。

いいえ、必ずしもそうとはerror: lvalue required as left operand of assignment限りません。参照を返さない限り、多くの場合、 が表示されます。(デモンストレーションについては、ここをクリックしてください)

一般的な理由は、チェーンを許可することです。たとえば、次のようなことを行います

mystream >> a >> b >> c;

void*入力/出力ストリームの場合、ストリームを(C++03) または(C++11)に変換できるという追加の利点もありますbool。これにより、次のような構造のエラーをチェックできます。

while (cin >> x) { ... }
于 2013-03-18T17:02:26.110 に答える
0

なぜなら、cin >> x>>yのようなものは機能しないからです。そして、これは前の例よりもはるかに頻繁に使用されます。

于 2013-03-18T16:54:11.327 に答える
0

非常にまれな状況で、(cin >> x) = y;これが望まれることはありません。左側の変数が返されると予想されます。例: (x += 5) = 7、「x」が返されてから 7 に設定されます。返されるのは「5」ではありません。したがって、期待される結果は「cin」が返されることであり、これにより、演算子チェーン(cin >> x)の実装が可能になります。

あなたの: '(cin >> x) = y;' では、予想される読み方は "cin >> x" であり、次に "cin = 7" です。これはあまり意味がありません。他の何かを返すと、期待が満たされないため、コードを読んでいるプログラマーを混乱させるだけです。(最小驚きの原則を参照)

これは、「x y」が常に左辺への参照を返す必要があるという意味ではありません。多くの場合、何か他のものを返す方が理にかなっています。たとえば、'myInt >> 4' は、 'myInt' を右に 4 ビット シフトしたコピーを返します。

于 2013-03-18T17:05:12.967 に答える