尽量用<iostream>而不用<stdio.h>

来源:互联网 发布:php mysql web 超清晰 编辑:程序博客网 时间:2024/04/28 22:53
 是的,scanf和printf很轻巧,很高效,你也早就知道怎么用它们,这我承认。但
尽管他们很有用,事实上scanf和printf及其系列还可以做些改进。尤其是,他们
不是类型安全的,而且没有扩展性。因为类型安全和扩展性是C++的基石,所以你
也要服从这一点。另外,scanf/printf系列函数把要读写的变量和控制读写格式的
信息分开来,就象古老的FORTRAN那样。是该向五十年代说诀别的时候了!

不必惊奇,scanf/printf的这些弱点正是操作符>>和<<的强项:


int i;
Rational r;// r 是个有理数

...

cin >> i >> r;
cout << i << r;

上面的代码要通过编译,>>和<<必须是可以处理Rational类型对象的重载函数(可
能要通过隐式类型转换)。如果没有实现这样的函数,就会出错(处理int不用这样
做,因为它是标准用法)。另外,编译器自己可以根据不同的变量类型选择操作符
的不同形式,所以不必劳你去指定第一个要读写的对象是int而第二个是Rational


另外,在传递读和写的对象时采用的语法形式相同,所以不必象scanf那样死记一
些规定,比如如果没有得到指针,必须加上地址符,而如果已经得到了指针,又要
确定不要加上地址符。这些完全可以交给C++编译器去做。编译器没别的什么事好
做的,而你却不一样。最后要注意的是,象int这样的固定类型和象Rational这样
的自定义类型在读写时方式是一样的。而你用sacnf和printf试试看!

你所写的表示有理数的类的代码可能象下面这样:


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;
}

上面的代码涉及到operator<<的一些微妙(但很重要)的用法,这在本书其他地方详
细讨论。例如:上面的operator<<不是成员函数(条款19解释了为什么),而且,传
递给operator<<的不是Rational对象,而是定义为const的对象的引用(参见条款
22)。operator>>的声明和实现也类似。

尽管我不大愿意承认,可有些情况下回到那些经过证明而且正确的老路上去还是很
有意义的。第一,有些iostream的操作实现起来比相应的C stream效率要低,所以
不同的选择会给你的程序有可能(虽然不一定,参见条款M16)带来很大的不同。但
请牢记,这不是对所有的iostream而言,只是一些特殊的实现;参见条款M23。第
二,在标准化的过程中,iostream库在底层做了很多修改(参见条款49),所以对那
些要求最大可移植性的应用程序来说,会发现不同的厂商遵循标准的程度也不同。
第三,iostream库的类有构造函数而<stdio.h>里的函数没有,在某些涉及到静态
对象初始化顺序的时候,如果可以确认不会带来隐患,用标准C库会更简单实用。

iostream库的类和函数所提供的类型安全和可扩展性的价值远远超过你当初的想象
,所以不要仅仅因为你用惯了<stdio.h>而舍弃它。毕竟,转换到iostream后,你
也不会忘掉<stdio.h>。

顺便说一句,本条款的标题没有打印错;我确实说的是<iostream>而非
<iostream.h>。从技术上说,其实没有<iostream.h>这样的东西——标准化委员会
在简化非C标准头文件时用<iostream>取代了它。他们这样做的原因在条款49进行
了解释。还必须知道的是,如果编译器同时支持 <iostream>和<iostream.h>,那
头文件名的使用会很微妙。例如,如果使用了#include <iostream>, 得到的是置
于名字空间std(见条款28)下的iostream库的元素;如果使用#include 
<iostream.h>,得到的是置于全局空间的同样的元素。在全局空间获取元素会导致
名字冲突,而设计名字空间的初衷正是用来避免这种名字冲突的发生。还有,打字
时<iostream>比<iostream.h>少两个字,这也是很多人用它的原因。:)
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ie浏览器删了怎么办 网络电视连接失怎么办 网络电视没信号怎么办 转让店铺后悔了怎么办 蘑菇街没有流量怎么办 淘宝店没有生意怎么办 蘑菇街直播封号怎么办 淘宝忘记给赠品怎么办 直通车的占比高怎么办 赠品质量有问题怎么办 淘宝赠品有问题怎么办 顾客叫送赠品怎么办 淘宝展现量低怎么办 dw模板不更新怎么办 闭水试验漏水怎么办 绘声绘影试用过了怎么办 探探被选成试用新版用户怎么办 淘宝被限制评论怎么办 信用钱包套路了怎么办 农业银行还贷迟了一天怎么办 淘宝限购一件怎么办 小米盒子电视打不开怎么办 手机淘宝总是卡怎么办 淘宝相机不能用怎么办 作业盒子没声音怎么办 作业盒子闪退怎么办 双面羊绒缩水了怎么办 作业盒子为静音怎么办 没有上进心的人怎么办 孩子不听老人话怎么办 淘宝分销没有视频怎么办 孕妇血糖稍高怎么办 苹果6s 卡怎么办 花呗额度用完怎么办 手机百度网站无法访问怎么办 手机应用删不了怎么办 华为p4屏幕切换怎么办 手机搜不到设置怎么办 华为手机设置成怎么办 手机截屏模糊怎么办 图片上传不清晰怎么办