cout探究

学习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的过程都清楚了。
原文地址:https://www.cnblogs.com/zuoca/p/2379685.html