接下来再说说printf() 和operator<<的问题。首先通过上面的讲解我们可以知道printf()函数继承自C标准库,而operator<<是标准C++所独享的。对于printf()函数,大家肯定很熟悉,它是可移植的、高效的,而且是灵活的;但是正如建议15中所说的那样,因为printf()、scanf()函数不具备类型安全检查,也不能扩充,所以并不完美;而C语言遗留的问题在C++的operator<<中得到了很好的解决,换句话说,printf()的缺点正是operator<<的长处。现在再去回顾建议15中提到的关于Student类型对象打印的问题,用operator<<就可以完美解决了:
|
当然了,相比C++ iostream程序库中的类,C中的stream函数也并不是一无是处的:
(1)一般认为C stream函数生成的可执行文件更小,有着更高的效率;Scott Meyers在《More Effective C++》的条款23中的测试也很好地证明了这一点;
(2)C++ iostream程序库中的类会涉及对象构造、析构的问题,而C stream函数没有这些,所以不会像前者那样因为构造函数带来不必要的麻烦。
(3)C stream函数有着更强的可移植能力。
对于一般应用程序而言,这三条优点还不足以打动他们,抛弃C++ iostream程序库,转而投向C stream函数。
请记住:
C++ iostream程序库中的类与C stream函数虽然各有优点,但是一般推荐使用前者,因为类型安全与可扩充性对于我们更有吸引力,所以,建议使用#include< iostream >,而不是#include< stdio.h >、#include< cstdio >、#include< iostream.h >。
建议24:尽量采用C++风格的强制转型
在建议11中,我们详细讲述了强制转型存在的一些问题,并建议在代码编写过程中尽量避免使用这个招人讨厌的东西。然而,正如哲学中所讲的一样:存在的即是合理的。强制转型肯定具有它存在的意义。在某些情形下我们必须求助于这个“讨厌鬼”,以帮助我们更好地完成程序设计。
比如,const属性的去除(请不要纠结于下面示例函数的“不良”设计):
|