条款2:尽量用<iostream>而不用<stdio.h>

来源:互联网 发布:2017淘宝上传宝贝视频 编辑:程序博客网 时间:2024/05/26 14:10

scanf和printf很轻巧,很高效,你也知道怎么用它们。但尽管他们很有用,事实上scanf和printf及其系列还可以做些改进。尤其是,他们不是类型安全的,而且没有扩展性。

scanf/printf的弱点正式操作符>>和<<的强项:

int i;

Rational r; //r 是个有理数

cin>> i >> r;

cout << i << r;

上面的代码要通过编译,>>和<<必须是可以处理Rational类型对象的重载函数。如果没有实现这样的函数,就会出错。

  另外,编译器自己可以根据不同的变量类选择操作符的不同形式,所以不必劳你去指定第一个要读写的对象是int而第二个是Rational。

   另外,再传递读和写的对象时采用的语法形式相同,所以不必像scanf那样死记一些规定,比如如果没有得到指针,必须加上地址符,而如果已经得到了指针,又要确定不要加上地址符。这些完全可以交给C++编译器去做。

 

#include <iostream>
using namespace std;

class Rational
{
public:
        Rational(int numerator = 0, int denominator = 1);
private:
        int n; //分子
        int d; //分母
        friend ostream& operator<<(ostream& s, const Rational&);
};

Rational::Rational(int numerator, int denominator):n(numerator),d(denominator){}

ostream& operator<<(ostream& s,const Rational& r)
{
        s<< r.n << '/' << r.d ;
        return s;
}

int main()
{
        Rational r(3,4);
        cout << r << '\n';
}


第一:有些iostream的操作实现起来比相应的C stream效率要低,所以不同的选择会给你的程序有可能带来很大的不同。但,这不是对所有的iostream而言的,只是一些特殊的实现。

第二:再标准化的过程中,iostream库在底层做了很多修改,所以对那些要求最大可移植性的应用程序来说,会发现不同的厂商遵循标准的程度也不同。

第三:iostream库的类有构造函数而<stdio.h>里的函数没有。
原创粉丝点击