当前位置:编程学习 > C/C++ >>

输入输出流,看似复杂却更好用----小话c++(2)

[Mac 10.7.1  Lion  Intel-based  x64  gcc4.2.1  xcode4.2]

 


Q: c++的默认输入输出和c的有什么优缺点?

A: 任何一种语言都会有自身最推荐的一套模式,因为设计者可能已经很认真考虑了。没有必要说哪种最好,哪种很差,最好和很差都有条件限制的。不同的使用者总能找到一种最适合自身的方式。

    c++的输入输出更面向对象化和模块化,它的操作其实蕴含着对于输入或者输出对象的操作,是输出一个整形,还是一个字符,或是一个自定义对象。而c中更能感受到函数和过程化的思维,输出没必要告诉使用者要使用一个对象,告诉我要输出什么,我就给你输出什么。

    因为c++的对象化,所以不用像printf一样一定要传入一个字符串,而是将输出的变量单独写出;这就导致有时用c++的方式写起来更方便,而有的时候在控制复杂的输出的时刻显得更复杂,printf的格式字符串中一个小小的格式变化即可输出不同情况,而使用cout可能需要修改更多的代码。

    c++的对象化以及重载运算符的方式,让输出一个对象的具体操作可以转移到对象内部,让对象自身来实现具体的输出;而printf默认没有此功能,程序员不得不在printf的时候加上具体对象输出逻辑或者封装一个输出对象数据的函数,这可能让程序员有时不能很好地记忆到底某个对象用什么输出函数,而c++将接口定义好了,就是<<, 看起来更易于使用。

    c语言中的printf函数的执行时采用动态解析格式字符串,根据是否是%d来输出一个整形,是否是%c来输出一个字符的方式,可能会导致运行时效率损失;而c++的输出方式,编译期间即可确定输出的是什么,这是printf效率在有时有可能低于cout的一个因素。

    c++和c语言的输入输出混用有时可能导致一些意想不到的问题,主要在于c++库对于c库的部分依赖性。所以,要特别小心,如果对于内部的机制很不清楚,最好不要随便混用。

 


Q: 对于输入输出中的各个类,它们之间到底是什么关系?

A: c++对于输入输出,有很多设计,它们共同形成了可以进行输入输出功能的简洁且易扩展的类设计图。下面将一一分析:

对于cout对象,它是ostream的一个对象,ostream的定义如下:

[cpp]  typedef basic_istream<char>       istream;    ///< @isiosfwd  
typedef basic_ostream<char>       ostream;    ///< @isiosfwd  
typedef basic_iostream<char>      iostream;   ///< @isiosfwd 
  typedef basic_istream<char>   istream; ///< @isiosfwd
  typedef basic_ostream<char>   ostream; ///< @isiosfwd
  typedef basic_iostream<char>   iostream; ///< @isiosfwd    同样,包括istream和iostream的定义。对于istream, ostream和iostream, 它们实现了输入和输出的具体功能(当然,它们内部还将调用其它内部函数实现最终的输入输出)。
    basic_istream类的实现如下(部分):

[cpp] template<typename _CharT, typename _Traits> 
  class basic_istream : virtual public basic_ios<_CharT, _Traits> 
  template<typename _CharT, typename _Traits>
    class basic_istream : virtual public basic_ios<_CharT, _Traits>[cpp] __istream_type&  
      operator>>(bool& __n) 
      { return _M_extract(__n); } 
       
      __istream_type&  
      operator>>(short& __n); 
       
      __istream_type&  
      operator>>(unsigned short& __n) 
      { return _M_extract(__n); } 
 
      __istream_type&  
      operator>>(int& __n); 
     
      __istream_type&  
      operator>>(unsigned int& __n) 
      { return _M_extract(__n); } 
 
      __istream_type&  
      operator>>(long& __n) 
      { return _M_extract(__n); } 
__istream_type&
      operator>>(bool& __n)
      { return _M_extract(__n); }
     
      __istream_type&
      operator>>(short& __n);
     
      __istream_type&
      operator>>(unsigned short& __n)
      { return _M_extract(__n); }

      __istream_type&
      operator>>(int& __n);
   
      __istream_type&
      operator>>(unsigned int& __n)
      { return _M_extract(__n); }

      __istream_type&
      operator>>(long& __n)
      { return _M_extract(__n); }[cpp] __istream_type& 
  get(__streambuf_type& __sb) 
  { return this->get(__sb, this->widen('\n')); } 
 
  int_type  
  peek();       
 
  __istream_type&  
  putback(char_type __c); 
 
    __istream_type&
      get(__streambuf_type& __sb)
      { return this->get(__sb, this->widen('\n')); }
 
      int_type
      peek();     

      __istream_type&
      putback(char_type __c);    可以看出,它实现了输入一个变量以及获取输入流最后数据、返回给输入流数据等一些列操作。
    如下是basic_ostream的实现(部分):

[cpp] template<typename _CharT, typename _Traits> 
  class basic_ostream : virtual public basic_ios<_CharT, _Traits> 
  template<typename _CharT, typename _Traits>
    class basic_ostream : virtual public basic_ios<_CharT, _Traits>[cpp] __ostream_type&  
operator<<(long __n) 
{ return _M_insert(__n); } 
 
__ostream_type&  
operator<<(unsigned long __n) 
{ return _M_insert(__n); }   
 
__ostream_type&  
operator<<(bool __n) 
{ return _M_insert(__n); } 
 
__ostream_type&  
operator<<(short __n); 
      __ostream_type&
      operator<<(long __n)
      { return _M_insert(__n); }
     
      __ostream_type&
      operator<<(unsigned long __n)
      { return _M_insert(__n); } 

      __ostream_type&
      operator<<(bool __n)
      { return _M_insert(__n); }

   

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,