C++,fstream 对象作为引用传递给函数,常量?

Posted

技术标签:

【中文标题】C++,fstream 对象作为引用传递给函数,常量?【英文标题】:C++, fstream objects passed to functions as reference, const? 【发布时间】:2013-01-03 09:38:03 【问题描述】:

我知道,一般来说,对数据的引用应该被隔离为函数中的常量,这样函数就无法更改它,对于仅用于输入的 fstream 对象是否同样适用?

比如……

void doFoo(fstream &fileName)

  fileName.open("data.txt", ios::in);
 

如果它是可取的,它是否遵循与大多数其他事情相同的逻辑?

比如……

void doFoo(const fstream &fileName)

  fileName.open("data.txt", ios::in);
 

也对输出流感到好奇

我只是想知道这是否重要,如果重要,为什么?

谢谢!

【问题讨论】:

尝试编译第二个。这是对两者的错误的补充。 简短回答:不。您基本上总是通过非常量引用传递 iostream。 【参考方案1】:

文件的恒定性不会转化为用于访问文件的对象的常量属性。即使只是读取文件,您也必须修改内部缓冲区、当前读取位置等。同样适用于输出,所以基本上 const 流是没有用的。

顺便说一句:如果您想明确一个函数只从流中读取,请将其传递给std::istream&。首先,istream 中的“i”可以合理地确保您不会写信给它。其次,fstream 缺少的“f”也允许与字符串流或 cin 等流一起使用。

【讨论】:

所以,如果我明白你在说什么,如果我想绝对确定不会污染文件的数据,如果我所做的只是读取它,请使用 istream,因为它只打开它以供输入。这是对你所说的话的准确评估吗? 是的。 istream 没有任何 write 函数。通过使用它,您实现了两件事:首先,您的函数的签名告诉读者它不打算修改流的内容。其次,编译器会阻止此类修改(除非您在函数内部进行强制转换,这将是非常糟糕的风格)。【参考方案2】:

如果你传递一个对象(比如fstream实例)作为const引用,你只能在它上面调用const成员函数,比如:

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

因为这样的函数不会改变对象的状态,所以对象可以是const。非 const 成员函数可能会修改成员变量,因此对象将不再是 const。现在,如果您查看fstream 的参考手册,您会发现open() 成员函数不是 const 的。所以第二个代码示例不会编译。

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

【讨论】:

以上是关于C++,fstream 对象作为引用传递给函数,常量?的主要内容,如果未能解决你的问题,请参考以下文章

C++对象的常引用

C++对象的常引用

c++中如何用函数传递fstream类型

传递由其他对象组成的对象数组作为对C++中函数的引用?

c++的复制构造函数

C++提高:拷贝构造函数