zoukankan      html  css  js  c++  java
  • 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的过程都清楚了。
  • 相关阅读:
    17. 电话号码的字母组合
    12. 整数转罗马数字
    01-正则表达式基础
    前端SEO技巧
    node.js
    Vue.生命周期
    Vue小案例--过滤器的基本操作
    vue简单的计算器
    VSCode 自动刷新
    Vue.js学习
  • 原文地址:https://www.cnblogs.com/zuoca/p/2379685.html
Copyright © 2011-2022 走看看