查以确保它不为0。这是由类的最后一个成员函数 F()来完成的。F()函数仅由其他成员函
数使用,因此是私有的。(我们不想让用户直接访问这个类的F i l e结构)
[ 1 ]
从任何意义上讲,这不是一个很坏的解决办法。它是相当有效的,可以设想为标准(控制
台)I / O和内核格式化(读/写一个存储块而不是一个文件或控制台)构造类似的类。
大的障碍是运行期间用作参数表函数的解释程序。这是在运行期间对格式串做语法分析以
及从参数表中索取并解释变量的代码。产生这个问题的四个原因是:
1) 即使仅使用解释程序的一部分功能,所有的东西将获得装载。假如说:
p r i n t f ( " % c " , ' x ' ) ;
我们将得到整个包,包括打印出浮点数和串的那部分。没有办法可减少程序使用的空间。
2) 由于解释发生在运行期间,所以不能终止这个执行。令人灰心的是在编译时,格式串里
的所有信息都在这儿,但是直到运行时,才能对其求值。但是,如果能在编译时分析格式串里
的变量,就可以建立硬函数调用,它比运行期间解释程序快得多(虽然 p r i n t f ( ) 族函数通常已被
优化得很好)。
3) 由于直到运行期间才对格式串求值,一个更糟糕的问题出现了:可能没有编译时的错误
检查。如果我们已经尝试找出由于在 p r i n t f ( )说明里使用错误的数或变量类型而产生的错误,我
们大概对这个问题很熟悉了。 C + + 对编译期间错误检查作了许多工作,使我们及早发现错误,
使工作更容易。特别是因为I / O库用得很多,如果弃之不用,那是很不明智的。
4) 对C + + ,最重要的问题是函数中的 p r i n t f ( )族不是能扩展的。它们被设计是用来处理 C中
四类基本的数据类型(字符,整型,浮点数,双精度及它们的变形)。我们可能认为每增加一
个新类时,都能增加一个重载的 p r i n t f ( )和s c a n f ( )函数(以及它们对文件和串的变量)。但是要
记住,重载函数在参数表里必须有不同的类型, p r i n t f ( )族把类型信息隐藏在可变参数表和格式
串中。对一个像C + +这样其目标是能容易地添加新的数据类型的语言,这是一个笨拙的限制。
6.2 解决输入输出流问题
所有这些问题都清楚地表明: C + +中应该有一个最高级别标准类库,用以处理 I / O 。由于
“h e l l o , w o r l d”差不多是每个人使用一种新的语言所写的第一个程序 , 而且由于I / O通常是每个程
序的一部分,因此 C + +中的I / O库必须特别容易使用。这是一个巨大的挑战:它不知道必须适
应哪些类,但是它必须能适用于任何新的类。这样的约束要求这个最高级别的类是一个真正的
有灵感的设计。
这一章看不到这个设计的细节以及如何向我们自己的类中加入输入输出流功能(在以后的
章节里将会看到)。首先,我们必须学会使用输入输出流,其次,在处理 I / O 和格式时,我们除
了能做大量的调节并提高清晰度外,还会看到,一个真正的、功能强大的 C + +库是如何工作的。
6.2.1 预先了解操作符重载
在使用输入输出流库前,必须明白这个语言的一个新性能,这一性能的详细情况在下一章
介绍。要使用输入输出流,必须知道 C + + 中所有操作符具有不同的含义。在这一章,我们特别
讲一下“< <”和“> >”,我们说“操作符具有不同的含义”,这值得进一步探讨。
在第5章中,我们已经学到怎样用不同的参数表使用相同的函数名。编译器在编译一个变
量后跟一个操作符再后跟一个变量组成的表达式时,它只调用一个函数。那就是说,一个操作
86 C + +编程思想
下载
[1] FULLWRAP test file和其实现在此书的源程序中提供,详见前言。