我正在阅读Andrew Koenig(作者)的“ C ++实例编程实例”,在本章中4.1.3 Reading homework grades
,有以下代码片段:
istream& read_hw(istream& in, vector<double>& hw){
//if(in){ /* HOW can be istream be used as bool in condition? -> commented out, this is not needed */
//hw.clear(); /*WHY to clear vector, when every instance is used only once? -> commented out, not needed*/
double x;
while(cin >> x)
hw.push_back(x);
//in.clear(); /* why to clear istream from error state, when if wrong value is passed, it is ignored anyway -> commented out*/
//} /* this is connected with the if-block */
return in; /*how is now in(istream) modified? where is binding between `std::cout` and `in`?? */
}
我有几个问题:
返回值:为什么函数具有istream类型作为返回值?为什么功能不无效?当该函数的唯一目的是填充向量时,它不必返回任何值。(此问题与最后一个有关istream的in
修改有关)
if(in):就像在注释中一样,我知道true
如果std::basic_ios::good
根据文档,它可能会有价值,但是,参数中的istream是新鲜实例,因此在调用它之前不应有任何错误状态,因此if子句是多余的。
hw.clear():再次,无需清除向量。这是一个新实例,程序中以前没有填充过该实例,那么为什么要这样做呢?
in.clear():这真的很困扰我。在非并行过程中这样做是否必不可少?我可以想到一种情况,何时清除缓冲区,即发生致命错误,否则,当缓冲区本身照顾错误时,我看不出要清除缓冲区的意义->传递了错误的值(即另一个值然后加倍这种情况)=>缓冲区只是忽略它,否则将调用EOF =>缓冲区将结束读取。缓冲区负责所有这些。
最后一个-如何std::cout
连接in
?书中的语录:
我们不知道cin的工作原理的细节,但大概是库将其定义为一种数据结构,该数据结构存储了库需要了解的有关输入文件状态的所有信息。从标准输入文件读取输入会更改文件的状态,因此它在逻辑上也应更改cin的值。
我可以想象std::cin
缓冲区的确是从键盘单词(由空格分隔)的输入中修改而来的,但是std::cout
和之间的连接在哪里in
,只有while(cin >> x)
修改了cin
,但是如何cin
知道将这些数据复制到另一个缓冲区中in
呢?或者,in
当该函数的唯一目的是填充矢量时,其目的甚至是什么?我想这与在某种程度上返回现在“修改过的”in
末尾有关,但是我真的看不到这两个缓冲区之间的联系。
我知道这与上面的书有关,因此,如果您还没有阅读过,则可能没有上下文,但是有些问题不需要上下文。
//
注释表示我认为不需要的原始代码的一部分,并且如果进行编译,它仍然可以工作,因此确实不需要。
/**/
解释了为什么我认为不需要
无论如何,对这些初学者的问题感到抱歉,我的背景仅仅是c
。
- 返回值:为什么函数具有
istream
类型作为返回值?为什么功能不无效?
函数类型肯定可以为空,您是正确的。但是,返回一个istream&
允许链接,如下所示:
std::string name;
read_hw(cin, gradevec) >> name;
这会将收到的第一个非双精度值cin
放入name
变量中。诚然,这是一个人为的示例,并不是最易读的示例,但是它确实说明了它是如何工作的。
if(in)
:如注释中所述,我知道如果std::basic_ios::good
根据文档,它可能具有真实值,但是,参数中的istream是新鲜实例
不,这不是一个新鲜的实例,它是一个参考值(由符号标志着&
在istream& in
已经被定义的功能之外)。
hw.clear()
:同样,无需清除向量。这是一个新实例,程序中以前没有填充过该实例,那么为什么要这样做呢?
再一次,实际上这不是一个新实例,它是对预先存在的向量(vector<double>&
)的引用。C没有这样的引用,它只有指针,因此此答案可以帮助您更好地了解发生了什么。
in.clear()
:这个真的很困扰我。在非并行过程中这样做是否必不可少?我可以想到一种情况,何时清除缓冲区,即发生致命错误。
in.clear()
令人困惑的是,它不会清除整个缓冲区,而只会清除各种状态标志,例如afailbit
或badbit
您不想留下来并导致将来的I / O操作失败的状态标志。
- 最后一个-如何
std::cout
连接in
?
为此,我只能猜测作者犯了一个错误并打算写while(in >> x)
。否则,根本没有合作in
的余地。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句