学习C++也有段时间了,一直想找个机会研究下cout。
引子:
int main(void)
{
int a=5;
cout<<a<<endl;/*这里究竟发生了什么*/
return 0;
}
首先说明下cout是个什么东西。
cout 实则为一个全局的ostream 类型,那么ostream又是什么类型呢?
查看STL文件,如下:
typedef basic_ostream<char, char_traits<char> > ostream;
原来是一个typedef。
那么basic_ostream又是什么东东呢?
它是输出流模板类,原型为
template<class _Elem,
class _Traits>
class basic_ostream
: virtual public basic_ios<_Elem, _Traits>
{
....
};
输出流模板类里面有一堆的成员函数,其中就包括我们经常用的operator<<操作符
定义如下(已简化)
Ostream_Type& operator<<(Type& t)
{
/*具体操作*/
return(*this);
}
知道cout为何物,接下来我们就来分析下程序吧。
首先分析 cout<<a
这里cout调用了自己的成员函数 operator<<,这个函数与我们平时用到函数有些不一样。
按照我们以前使用函数的方式,应该下面这样
cout.operator<<(a);
这样当然没有任何错误了,只是看起来不怎么优雅。
因为流模板类里已经实现了operator<<()函数的多个重载版(针对基本数据类型),那么cout<<a就会调用实现了int类型的重载版本
函数返回值仍为一个basic_stream类型,这样的好处就是我们可以写出cout<<a<<b<<c的级联操作。
既然cout<<a返回了basic_stream类型,那么接下来的操做就是cout<<endl了
那么cout<<endl又是怎么一回事呢?
其实endl是一个函数指针,
定义如下(已简化)
inline Ostream_Type& endl(Ostream_Type& out)
{
// insert newline and flush byte stream
out.put('\n');
out.flush();
return (out);
}
那么cout<<endl,不过是operator<<函数接受了一个函数指针而已。
STL中定义如下(已简化)
Ostream_Type& operator<<(Ostream_Type& (*pFunc)(Ostream_Type&))
{
return ((*pFunc)(*this));
}
_Pfn就是我们传入的endl啦
然后函数执行(*_Pfn)(*this),即执行endle函数本身
整个cout<<a<<endl的过程都清楚了。