cout之详解


1. cout 究竟是什么?

cout是C++中的“标准输入输出流”对象。C++中推荐使用cout,C中推荐使用printf。

其实,cout是一个iostream类的对象,它有一个成员运算符函数operator<<,每次调用的时候就会向输出设备(一般就是屏幕啦)输出东东。简单的说,就是运算符重载,重载了“<<”运算符。请看HelloWorld!的等效版本:


#include  <iostream>using namespace std;   int main()   {   cout.operator<<("Hello,World!");   cout.operator<<(endl);   return 0;}

编译运行,结果一致。

2.为什么函数operator<<能够接受不同类型的数据,如整型、浮点型、字符串甚至指针呢?

运算符函数与一般函数基本无异,可以任意重载。标准库的设计者们早已经为我们定制了iostream::operator<<对于各种C++基本数据类型的重载版本。

3. 仿真验证cout

我们自己来实现一个cout的简化版(Lite)。为了区分,我们把我们设计的cout对象命名的myout,myout对象所属的类为MyOutstream。我们要做的就是为MyOutstream类重载一系列不同类型的operator<<运算符函数,简单起见,这里我们仅实现了对整型(int)与字符串型(char*)的重载。为了表示与iostream断绝关系,我们不再用头文件iostream,而使用古老的stdio中的printf函数进行输出,程序很简单,包括完整的main函数,均列如下:


class MyOutstream   {  public:   const MyOutstream& operator<<(int value)const;//对整型变量的重载   const MyOutstream& operator<<(char* str)const;//对字符串型的重载   };   const MyOutstream& MyOutstream::operator<<(int value)const   {   printf("%d",value);     return *this;//注意这个返回……   }   const MyOutstream& MyOutstream::operator<<(char*str)const  {    printf("%s",str);     return *this;//同样,这里也留意一下……  }   MyOutstream myout;//随时随地为我们服务的全局对象myout   int main()  {   int a=2003;     char* myStr="Hello,World!";    myout<<myStr<<"n";   return 0;   }

4. 如何实现cout<<... <<... 连续输出字符的功能

考虑到cout能够连续输出字符,例如cout<<"Hello,World!"<<endl; 而不是cout<<"Hello,World!"; cout<<endl, 我们分析一下:按执行顺序,系统首先调用cout.operator<<("Hello,World!"),然后cout.operator<<会返回它本身,就是说在函数的最后一行会出现类似于return *this这样的语句,因此cout.operator<<("Hello,World!")的调用结果就返回了cout,接着它后面又紧跟着.operator<<(endl),这相当于cout.operator<<(endl)——于是又会进行下一个输出,如果往下还有很多<<算符,调用就会一直进行下去。

5. C++中的endl的功能与含义

运行函数,得到结果:myout<<"n" ,最后出现的"n"可以实现一个换行,不过我们在用C++时教程中推荐使用endl。

endl是一个操纵符(manipulator),它不但实现了换行操作,而且还对输出缓冲区进行刷新。原来在执行输出操作之后,数据并非立刻传到输出设备,而是先进入一个缓冲区,当适宜的时机(如设备空闲)后再由缓冲区传入,也可以通过操纵符flush,ends,或unitbuf进行强制刷新:cout<<"Hello,World!"<<"Flush the screen now!!!"<<flush; 这样当程序执行到operator<<(flush)之前,有可能前面的字符串数据还在缓冲区中而不是显示在屏幕上,但执行operator<<(flush)之后,程序会强制把缓冲区的数据全部搬运到输出设备并将其清空。而操纵符endl相当于<<"n"<<flush;不过可能在屏幕上显示是手动刷新与否区别看来都不大。但对于文件等输出对象就不大一样了:过于频繁的刷新意味着老是写盘,会影响速度。因此通常是写入一定的字节数后再刷新,如何操作?靠的就是这些操纵符。

本文转自 http://baike.baidu.com/view/1261354.htm

由本人进行了简化
原文链接: https://www.cnblogs.com/meimei888/archive/2010/10/20/1856832.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/16328

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午4:38
下一篇 2023年2月7日 下午4:38

相关推荐