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 流是没有用的。

顺便说一句:如果您想明确一个函数只从流中读取,请将其传递给std::istream&. 首先,“i”中的“i”istream合理地确保您不会写信给它。其次,缺少的“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 的。所以第二个代码示例不会编译。

一般来说:传递类类型的参数,const &除非它们将在函数中被修改。打开流当然一种修改。所以只需通过非常量引用传递它。

于 2013-01-19T23:17:21.127 回答