C++标准库笔记:13.6 操控器

来源:互联网 发布:希拉里 放过, 知乎 编辑:程序博客网 时间:2024/06/11 17:56

操控器是什么

std::cout << std::endl;此句代码中std::endl为操控器,操控器是用来操控stream对象的,常常只会改变输入或格式化输出的解释方式。

  • std::cout << std::endl:输出’\n’,并刷新output缓冲区
  • std::cout << std::ends:输出’\0’
  • std::cout << std::flush:刷新output缓冲区
  • std::cin >> std::ws >> strTemp: 读入并忽略空格

其中std::ws格外给个测试例子(^-^)

    //ws是一次性的,执行了任意格式化io操作后,就恢复默认值      char strTemp[16] = { 0 };    std::cin >> std::ws;    while( std::cin.getline( strTemp, sizeof(strTemp) ) )    {        cout << strTemp << endl;        std::cin >> std::ws;    }

操控器运行原理

操控器是一个特定格式的函数,而stream以这个特定格式函数为参数重载了相应的格式操作符<< 、>>。如std::cout << std::endl;,操作符执行时,碰到std::endl,则以参数std::endl调用相应的<<重载函数(此处叫操控器)。

operator<<实现代码片断:

_Myt& __CLR_OR_THIS_CALL operator<<(_Myt& (__cdecl *_Pfn)(_Myt&)){   // call basic_ostream manipulator    _DEBUG_POINTER(_Pfn);    return ((*_Pfn)(*this));}

endl的实现代码片断:

template<class _Elem,    class _Traits> inline    basic_ostream<_Elem, _Traits>&        __CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr){   // insert newline and flush stream    _Ostr.put(_Ostr.widen('\n'));    _Ostr.flush();    return (_Ostr);}

自定义操控器

知道了操控器的运行原理,只要按其格式写个函数就行,以下是个输出hello的操控器例子

template<class T, class traits> inline basic_ostream<T, traits>& out_hello(basic_ostream<T, traits>& os ){       char szTemp[] = "hello";    os.write( szTemp, sizeof(szTemp) );    return os;}int main(){    cout << out_hello << endl;    return 0;}
原创粉丝点击