scanf和printf及其系列的缺点:
(1)他们不是类型安全的
(2)没有扩展性
(3)scanf/printf系列函数把要读写的变量和控制读写格式的信息分开来
---------------------------------------------------------------------
scanf/printf的这些弱点正是操作符>>和<<的强项:
int i;
Rational r;// r 是个有理数
...
cin >> i >> r;
cout << i << r;
(1)>>和<<必须是可以处理Rational类型对象的重载函数(可能要通过隐式类型转换)。实现举例如下面的代码。如果没有实现这样的函数,就会出错(处理int不用这样做,因为它是标准用法)。
(2)编译器自己可以根据不同的变量类型选择操作符的不同形式,所以不必劳你去指定第一个要读写的对象是int而第二个是Rational。
(3)在传递读和写的对象时采用的语法形式相同,所以不必象scanf那样死记一些规定。这些完全可以交给C++编译器去做。
class Rational {
public:
Rational(int numerator = 0, int denominator = 1);
...
private:
int n, d;// 分子,分母
friend ostream& operator<<(ostream& s, const Rational& );
};
ostream& operator<<(ostream& s, const Rational& r)
{
s<< r.n << '/' << r.d;
return s;
}
---------------------------------------------------------------------
以下情况使用c stream 更好:
第一,有些iostream的操作实现起来比相应的C stream效率要低
第二,在标准化的过程中,iostream库在底层做了很多修改,所以对那些要求最大可移植性的应用程序来说,会发现不同的厂商遵循标准的程度也不同。
第二,iostream库的类有构造函数而<stdio.h>里的函数没有,在某些涉及到静态对象初始化顺序的时候,如果可以确认不会带来隐患,用标准C库会更简单实用。
---------------------------------------------------------------------
其实没有<iostream.h>这样的东西——标准化委员会在简化非C标准头文件时用<iostream>取代了它。如果使用了#include <iostream>, 得到的是置于名字空间std下的iostream库的元素;如果使#include<iostream.h>,得到的是置于全局空间的同样的元素。在全局空间获取元素会导致名字冲突,而设计名字空间的初衷正是用来避免这种名字冲突的发生。