Item2 用<iostream>而不用<stdio.h>
Prefer <iostream>
to <stdio.h>
.
(type safety and extensibility weaknesses of printf/scanf are the strengths of operator>> and operator<<. )
int i;
Rational r; // r is a rational number
...
cin >> i >> r;
cout << i << r;
printf/scanf是不安全的,这些缺点正是<<操作符和>>操作符的长处。上面的代码运行的前提是为类Rational实现<<操作符和>>操作符,否则的话会出错。并且,如果一个<<操作符对应有多个函数体,编译器会自动选择。
另外<<操作符和>>操作符的读写参数是同一类型,而Scanf的读写参数是不同类型。一个典型的<<操作符函数如下
class Rational
{
public:
Rational(int numerator = 0, int denominator = 1);
...
private:
int n, d; // numerator and denominator
friend ostream& operator<<(ostream& s, const Rational& r);
};
ostream& operator<<(ostream& s, const Rational& r)
{
s << r.n << '/' << r.d;
return s;
}
有些细微而重要的地方,一个是<<操作符函数不是类的成员函数(Item19)。另一个是传给<<操作符函数的是Rational对象的引用而不是一个对象(Item22),同理>>操作符也一样。
有些情况下,还是需要使用stdio.h, 首先相对C库内的stdio.h,实现<<操作符和>>操作符并不高效。Item23的一些特殊的应用还是使用了stdio.h. 还有,在iostream库中实现了构造函数而在stdio.h中没有。有些时候使用stdio.h只是任意性和简单。
#include<iostream>和<iostream.h>的差别,前者得到std命名空间下的所有iostream的所有元素,后者是在整个全局空间内得到iostream的所有元素,这样可能会导致命名空间冲突。