学习《c/c++程序员实用大全》心得(二)

来源:互联网 发布:贫困山区教育数据 编辑:程序博客网 时间:2024/05/21 15:01

很高兴,学习《c/c++》系列又出二了。这篇文章将要讲一讲"cin>>","cout<<"究竟做了什么事。 

什么叫"c++有魔力的操作符"我还不太了解,因为确实不能理解操作符在类库里面是怎样定义的,或着在类库里面定不定义。但文章中说cin、cout这些标识符不是建立在c++有魔力的操作符是可以理解的。 

首先,cin、cout、cerr、clog都是类的实例。c++中定义了I/O流类。I/O流类中的基类ios派生出子类istream和ostream。 cin是istream类的对象,而cout、cerr、clog是ostream类的对象。我们知道,在c语言中,stdout默认对应标准输出设备,stdin默认对应标准输入设备,他们都被赋值为文件句柄。这是很容易理解的。因为我们学过,在unix系统中,"一切皆文件",因此stdout和stdin都是指向设备文件句柄。cin,cout这些也是一样。cin默认对应键盘,cout默认对应屏幕,cerr对应屏幕,clog对应打印机。但是,cin和cout是可以重定向的,cerr和clog是不能够重定向的。下面的程序很好的解释了cout对应文件句柄和可以重定向的概念(其中ofstream是ostream的子类)。

显然,重定向做了这样一件事,即给cout重新赋值。在dos下使用重定向操作符可以完成此项功能。那么cout和cin可以重定向,cerr和clog却不能重定向又该如何理解呢?私以为,这是通过在类库中将cout和cin定义成变量,将cerr和clog定义成常量来实现的。网上另有一种解释,是说cout写到缓冲区,而cerr直接写到设备,因为cout有写入缓冲区的的过程,因此流可以被其他设备或文件截取。但我们知道clog也是不能够重定向的,它却恰恰是写入缓冲区的,因此,这种解释似乎不太合理。 

再来说说">>","<<"输入输出操作符。">>"的作用是指定数据从哪个流输入,"<<"的作用是指定数据输出到哪个流。既然它们是操作符,那么就和+、—、*、/这些操作符差不多。这就很容易解释为什么输入输出操作符不能被重载为成员函数了。我们可以简单的认为"<<"是一个双目操作符,这个双目操作符的第一个操作数是流对象cout,而不是用户定义的类对象。只有当第一个操作数是类对象时,才能重载为该类的成员函数。

原创粉丝点击