STL之cout<<hex
2014-06-28 00:03
232 查看
闲来无事发现cout也可以进行各种格式化输出,比如命令cout<<hex,使得这条语句之后的整数输出都为十六进制格式。于是我便很好奇是这个语句怎么改变输出流的状态的。
翻了一下STL源码,它是这么定义hex的
变量名称太复杂,无事之,看到这里我们知道hex实际上是一个函数名(在C++里函数名等同于指向函数的指针),这个函数调用iobase类的setf()方法改变输入流状态的。
cout实际上是ostream类的一个对象
ostream类由模板类basic_ostream实现
basic_ostream类重载了很多种<<操作符,找到和hex相关的
当我们输入cout<<hex时,编译器自动找到<<操作符的上述重载版本,直接调用hex(cout);
因此cout<<hex等效于hex(cout)
不禁某大神说过的话:“学习STL最快最有效的方法并不是去看《STL源码剖析》之类的书,而是应该去翻看STL源码本身。”
翻了一下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源码本身。”
相关文章推荐
- cout<<a++<<++a<<a 的结果??
- STL:集合#include <set>
- 读入N, S两个自然数(0<=S,N<=9),打印相应的数字三角形(其中,S表示确定三角形的第一个数,N表示三角形的行数)。(提示:左右对齐可使用cout<<left、cout<<right)
- STL之<set>
- cout<<格式输出的使用
- 标准模板库(STL)之<algorithm>初步学习
- STL分析-准备工作<一>
- cout<<endl;与cout<<"/n";的区别
- 11/7/8 STL 映射容器 map< K , T > 学习笔记
- stl::map的比较函数(less, <)
- 11/7/2 STL vector<T> (2)
- 在 Python中使用 cout << 'Hello,world!' << endl
- cout<<"hello csdn";
- 小议 cout << i << " " << i++ << endl
- 对cout << 重载的源代码
- (zz)对cout << 重载的源代码
- NO.2 C++的cout高阶格式化操作<转载>
- [细节决定B度]之回首一瞥cout<<"Hello,world"<<endl;
- cout<<""; 的作用
- hdoj1707(set)(s[day][time].insert(name))(cout<<" "<<*it)