4

一般に、データへの参照は関数内の定数として分離して、関数が変更できないようにする必要があることを知っていますが、入力にのみ使用されている fstream オブジェクトにも同じことが当てはまりますか?

そのような...

void doFoo(fstream &fileName)
{
  fileName.open("data.txt", ios::in);
} 

それが賢明である場合、それは他のほとんどすべてと同じロジックに従いますか?

そのような...

void doFoo(const fstream &fileName)
{
  fileName.open("data.txt", ios::in);
} 

出力ストリームにも興味があります

それが重要なのかどうか疑問に思っています。もしそうなら、なぜですか?

ありがとう!

4

2 に答える 2

7

ファイルの定数は、ファイルへのアクセスに使用されるオブジェクトの定数属性には変換されません。ファイルを読み込むだけでも、内部バッファや現在の読み込み位置などを変更する必要があります。出力も同様であるため、基本的に const ストリームは役に立ちません。

ところで:関数がストリームからのみ読み取ることを明確にしたい場合は、それに a を渡しますstd::istream&。まず、"i" は、istream書き込みを行わないことを合理的に保証します。第 2 に、"f" が欠落しfstreamているため、stringstreams や cin のようなストリームでも使用できます。

于 2013-01-19T23:19:09.347 に答える
1

オブジェクト (fstreamインスタンスなど) を const 参照として渡す場合、次constのようなメンバー関数のみを呼び出すことができます。

// In some class declaration
void aConstMember(int a) const;

これは、そのような関数がオブジェクトの状態を変更しないためです。したがって、オブジェクトはconst. 非 const メンバー関数はメンバー変数を変更する可能性があるため、オブジェクトは const ではなくなります。のリファレンス マニュアルをfstream見ると、open()メンバー関数が const ではないことがわかります。したがって、2 番目のコード例はコンパイルされません。

一般的に: クラス型の引数はconst &、関数内で変更されない限り渡してください。ストリームを開くことは確か変更です。したがって、非 const 参照で渡すだけです。

于 2013-01-19T23:17:21.127 に答える