您的位置:首页 > 其它

STL之cout<<hex

2014-06-28 00:03 232 查看
闲来无事发现cout也可以进行各种格式化输出,比如命令cout<<hex,使得这条语句之后的整数输出都为十六进制格式。于是我便很好奇是这个语句怎么改变输出流的状态的。

翻了一下STL源码,它是这么定义hex的

inline ios_base& __CLRCALL_OR_CDECL hex(ios_base& _Iosbase)
{	// set basefield to hex
_Iosbase.setf(ios_base::hex, ios_base::basefield);
return (_Iosbase);
}


变量名称太复杂,无事之,看到这里我们知道hex实际上是一个函数名(在C++里函数名等同于指向函数的指针),这个函数调用iobase类的setf()方法改变输入流状态的。

cout实际上是ostream类的一个对象

__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 ostream cout, *_Ptr_cout;


ostream类由模板类basic_ostream实现

typedef basic_ostream<char, char_traits<char> > ostream;


basic_ostream类重载了很多种<<操作符,找到和hex相关的

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


当我们输入cout<<hex时,编译器自动找到<<操作符的上述重载版本,直接调用hex(cout);

因此cout<<hex等效于hex(cout)

不禁某大神说过的话:“学习STL最快最有效的方法并不是去看《STL源码剖析》之类的书,而是应该去翻看STL源码本身。”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: