输入输出流,看似复杂却更好用----小话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++ ,