转载:https://blog.csdn.net/kdmcser/article/details/35374389
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)
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a,b,c;
cin>>hex>>a;//输入的是16进制的数
cin>>oct>>b;//输入的是8进制的数
cin>>dec>>c;//输入的是10进制的数
cout<<a<<endl;//a,b,c分别转换成10进制
cout<<b<<endl;
cout<<c<<endl;
cin>>a;
cout<<hex<<a<<endl;//输出的是16进制的数
cout<<oct<<a<<endl;//输出的是8进制的数
cout<<dec<<a<<endl;//输出的是16进制的数
return 0;
}