首页 > 编程语言 >C++标准库笔记:13.4.3 Stream状态与布尔条件测试

C++标准库笔记:13.4.3 Stream状态与布尔条件测试

时间:2022-12-07 15:33:41浏览次数:87  
标签:fail Stream void C++ 重载 bool operator 操作符 13.4


流条件测试

int a = 0;
while( (std::cin >> a) )
{
cout << a << endl;
}

以上代码得以使用std::cin来做条件测试,是因为Stream在类ios_base内定义了两个可用于布尔表达式的函数,

__CLR_OR_THIS_CALL operator void *() const
{ // test if any stream operation has failed
return (fail() ? 0 : (void *)this);
}

bool __CLR_OR_THIS_CALL operator!() const
{ // test if no stream operation has failed
return (fail());
}

以上有个疑惑,为什么要重载void*,而不直接重载bool呢?
原来是因为流对操作符<<和>>做了重载,如果重载operator bool()的话,此处就会出现bool << 和 bool >>的情况,这是一种移位操作,同流操作符<<和>>产生了二义性。因此标准库就只能退而求其次,重载operator void*代替operator bool了(这些都是站在c++98的基础上说的,c++11已经不一样了,具体可看​​​此处​​)

operator !()使用注意事项

我们可以使用!操作符来对流进行测试,如下

int a = 0;
do
{
if ( !(cin >> a) )
{
break;
}
cout << a << endl;
}while( true );

其中!操作符之后的小括号是必须的,因为!操作符的优先级高于 >>

使用建议

使用转换为布尔的方式,即使用operator void* 与operator !(),会引起编程风格的争论。通常,使用诸如fail()这样的有较佳可读性


标签:fail,Stream,void,C++,重载,bool,operator,操作符,13.4
From: https://blog.51cto.com/u_15905375/5919612

相关文章

  • c++标准库笔记:13.4.4 Stream的状态和异常
    设置触发异常Stream缺省的情况下不抛出异常,但可由成员函数exceptions来设置这种行为。exceptions有两种形式:获取引发异常的标志(不带参数)设置引发异常的标志(带参数)//Thisme......
  • 注意!!一定要谨慎使用c/c++原生指针
    主要是顶层逻辑中引用了一个指针,而在业务逻辑中将此指针删除了。这种在代码量很少的情况下,很容易被发现,但是代码量多了,逻辑多了的时候,想一下子定位到问题所在,就没那么容易了......
  • C++11 STL 完美转发
    http://m.biancheng.net/view/7868.htmlC++11标准为C++引入右值引用语法的同时,还解决了一个C++98/03标准长期存在的短板,即使用简单的方式即可在函数模板中实现参数......
  • C++——map设置两个value的方法
    方法:方法一:​​std::multimap<string,pair<int,int>>mulmap;​​方法二:​​std::multimap<string,vector<int>>mulmap;​​相关用法:​​C++——pair用法​​......
  • C++——引用&的功能及与指针*的区别
    C++——引用&的功能及与指针*的区别​​一、引用&的功能​​​​二、与指针*的区别​​​​三、真实案例​​​​参考资料​​一、引用&的功能用于函数传递参数,实现改变某个......
  • Vscode——windows系统搭建C/C++开发环境
    VSCode——windows系统搭建C/C++开发环境​​一、搭建C开发环境​​​​1.安装MinGW​​​​2.配置文件​​​​二、搭建C++开发环境​​​​1.安装MinGW​​​​2.配置文......
  • C++——cv::Rect数据结构详解
    成员rect.tl()//矩形左上角点的坐标rect.br()//矩形右下角点的坐标rect.size()//矩形的大小rect.area()//矩形的面积rect.empty()//判断矩形是否为空rect.contains()//判......
  • C++ 读写文本文件
    1.逐行读文本,文本以空格分隔points.txt文件内容如下:indexx1y1x2y202473722646141224158246400238926440750934664349028943337949618......
  • Stream操作双列集合
    双列集合:转换成单列集合后再创建Map<String,Integer>map=newHashMap<>();map.put("蜡笔小新",19);map.put("黑子",17);map.put("......
  • Java8的Stream流如此强大,你知道它的原理吗
    ......