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/archive/2012/03/04/2379685.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值