C++语言程序设计

C++语言同C语言一样，也不具有内部输入输出能力，这样做的目的是为了最大限度地保证语言与平台的无关性。计算机语言的输入输出功能都是与操作系统相关的，如果C++为某种操作系统实现内部输入输出功能，那它也就被限制在这个操作系统上了，这是我们所不希望的。
如果一个应用程序没有输入和输出，那它也就没有应用价值。在C++中，输入输出功能，是通过调用该操作系统的I/O库来实现的。
scanf、printf都是C语言标准输入输出库函数，不能否认，C语言的标准输入输出库函数也是安全、高效的，为什么说C++的输入输出更安全高效呢？关键在于C++的输入输出与C的输入输出实现方法不同。
C++的输入输出是如何实现的？是不是依据面向对象的思想，把C的标准I/O库封装成类，然后进行处理呢？比如操作一个文件，我们想确保文件能够安全地打开，及时地关闭，而不完全依赖用户调用open()、close()函数，可以构造一个文件类，定义一个成员变量，作为文件指针，分别在构造函数和析构函数中打开、关闭文件。再进一步，可以在类中实现C的标准输入输出库中所有的I/O函数，并把文件指针置为私有变量。从外面看来，这已经是一个封装得很好的文件类。在某种意义上讲，这种方法是相当有效的，我们也可以为标准I/O和存储块构造类似的类。
我们已经知道，C++是使用iostream流库，并没有使用C的输入输出库，是不是iostream流库更好呢？答案是肯定的。C的I/O库函数主要用来处理基本数据类型（字符、整型、浮点数等），使用参数表进行数据传输，使用格式字符串指定数据类型和输入输出格式。它们在运行时对格式字符串进行语法分析，并据此对变量进行解释。例如：
printf("a=%d\tb=%d\ta+b=%d\n",a,b,a+b);
C语言I/O库的缺点是：
1． 即使只使用了解释程序的一个功能，也要全部装载。如上面的例子，我们要装载整个包，包括解释浮点数和字符串那部分程序段，无法减少程序的长度。
2． 虽然printf族函数已经优化得很好，但是，它是在运行期间进行解释，如果能在编译期间分析格式字符串里的变量，根据不同的类型调用各自的函数处理，运行会快得多，而且C++编译期间的类型检查会有助于我们发现错误。
3． 对于C++来说，printf不能被扩展是它最大的缺点。我们不能通过重载函数对它进行扩展，因为重载函数要有不同类型的参数，而printf族函数把类型信息隐藏在可变参数表和格式字符串中。
iostream是通过类的继承，类成员函数的重载来实现的，利用类的可继承性和多态性，使iostream类库使用统一的函数接口操作标准I/O、文件、存储块等输入输出设备。通过函数重载，为每种内部数据类型定义了流输入输出函数，使得用户可以用相同的格式对各种数据类型进行操作，编译程序根据数据的类型自动选择相应的输入输出函数，不必将所有函数一并加载。同时，iostream拥有了很好的扩展性，用户通过重载还可以对自定义对象进行流的操作。因此，与标准C输入输出库的各种各样的函数相比，输入输出流更容易、更安全、更有效。
12.1.1 输入输出流类层次
iostream是一组C++类，用于实现面向对象模型的输入输出，可以提供无缓冲的（低级）和缓冲的I/O操作。在某些情况下，如果C++编译器提供的iostream库中没有合适的输入输出函数可用，我们还可以利用类的继承和多态特性来改进它们，左图给出了I/O流类之间的继承关系。