【问题标题】:Introduction To C++ IO StreamsC++ IO 流简介
【发布时间】:2014-03-09 21:55:46
【问题描述】:

我从this article 获得了一个sn-p 代码,但我不知道它是如何工作的? sn-p 开头说:

您可以通过测试读取结果来检测特定的读取或写入操作是否失败。例如,要检查是否从用户那里读取了一个有效的整数,您可以这样做:

int x;
if ( cin >> x ) 
{
    cout << "Please enter a valid number" << endl;
}

这是有效的,因为读取操作会返回对流的引用。

我知道 cin >> x 操作返回对 cin 的引用,但我仍然对评估对标准输入流对象的引用如何允许您检查输入是否为有效整数感到困惑。

【问题讨论】:

标签: c++ casting operator-overloading iostream


【解决方案1】:

cinistream 模板类的一个实例。 operator &gt;&gt; 作用于此 istream 实例以将输入加载到数据中并返回对此 istream 的引用。然后在while 条件下,通过调用cin::operator void*() const(C++11 中的explicit operator bool() const)对其进行测试,该函数调用fail() 函数来测试操作是否成功。这就是为什么你可以在 while 条件下使用这个操作

while ( cin >> x)
{
   //...

【讨论】:

    【解决方案2】:

    根据文档(http://www.cplusplus.com/reference/ios/ios/operator_bool/),运营商

    explicit operator std::ios::bool() const;
    

    “返回是否设置了错误标志(failbit 或 badbit)。”和“如果设置了这些错误标志中的至少一个,则该函数返回 false,否则返回 true。”

    因此,当if 语句将cin 流转换为bool 时,如果流设置了错误标志,则此运算符返回false,否则返回true

    【讨论】:

    • 正如@David Rodríguez 所指出的,源文章的逻辑颠倒了。您可以仔细检查文档和/或自己进行实验!
    猜你喜欢
    • 2012-01-21
    • 2016-03-02
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多