2017-06-09 11 views
0

KoenigとMooのAccelerated C++ブック(57ページ)では、以下に示す関数を提供します。これはinです。その理由は、入力が成功したかどうかを示すことです(55ページ)。しかし、inは、関数の引数の1つとして参照渡しされました。だから元のオブジェクトを見て、アイスストリームの状態を取得することはできませんか?C++の関数への参照によって渡されたオブジェクトを返すのはなぜですか?

// read homework grades from an input stream into a `vector<double>' 
istream& read_hw(istream& in, vector<double>& hw) 
{ 
    if (in) { 
     // get rid of previous contents 
     hw.clear(); 

     // read homework grades 
     double x; 
     while (in >> x) 
      hw.push_back(x); 

     // clear the stream so that input will work for the next student 
     in.clear(); 
    } 
    return in; 
} 
+1

を読み込むことができますが、 'であることができますが、'しばらく(read_hw(S、データ)){...} while(s){read_hw(s、data);よりももっと良い。 if(s){...}} ' – molbdnilo

答えて

8

これは、各メソッド呼び出しがistreamオブジェクトへの参照を返すので、この

read_hw(cin, hw).read_something_else(cin, x).blah_blah(cin, y) 

のように、それはチェーンのメソッド呼び出しに使用することができ、あなたが流暢なインターフェースを構成することができます。あなたは

cin >> a >> b; 

を行う際に、実際にある

は何が起こるかは、各operator>>関数呼び出しは、ストリームの参照を返しますので、連鎖させることができます。

それはまた、あなたはループに許可し、istreamオブジェクトからidiomatic way in C++、例えば

while (read_hw(cin, hw)) { 
    do_something_with_hw(hw); 
} 
+1

驚くばかりの答え、おかげで束! – dpritch

1

BLUF:はい。

より長いバージョン:inを返すことによって、渡されたものがパラメータであることを実装者に通知します。それは大会です。関数が戻り値だけで通信する場合は、仮パラメータ・リストの入力と区別できます。

これは行う必要はありませんが、通常は1つの値しか返さない場合に便利です。その後、各通話のドキュメントを参照する必要はありません。大会では、「私が戻ってきたことがステータスを示している」ことを知っています。

私の2cでは、このプラクティスは多くの現実的なコーディング例にはあまり行き渡っておらず、一貫性がなくても説得力がありません。私は一般にそれを使用しません。関連する例として、GoとLuaコードは両方とも複数の値を返すことができます。それらの言語では、最初に返される値を関数の実行が成功した結果にすることがより自然であり、2番目の値は結果の「状態」になります。 OK、悪い、など

+0

興味深い情報がたくさんあります、ありがとう! – dpritch

関連する問題