关闭

编写高质量代码:改善C++程序的150个建议(连载12)

发表于:2012-4-18 09:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李健    来源:51Testing软件测试网采编

  接下来再说说printf() 和operator<<的问题。首先通过上面的讲解我们可以知道printf()函数继承自C标准库,而operator<<是标准C++所独享的。对于printf()函数,大家肯定很熟悉,它是可移植的、高效的,而且是灵活的;但是正如建议15中所说的那样,因为printf()、scanf()函数不具备类型安全检查,也不能扩充,所以并不完美;而C语言遗留的问题在C++的operator<<中得到了很好的解决,换句话说,printf()的缺点正是operator<<的长处。现在再去回顾建议15中提到的关于Student类型对象打印的问题,用operator<<就可以完美解决了:

  1. class Student  
  2. {  
  3. public:  
  4.      Student(string& name, int age, int scoer);  
  5.      ~ Student();  
  6. private:  
  7.    string m_name;  
  8.      int    m_age;  
  9.      int    m_scoer;  
  10. friend ostream& operator<<( ostream& s, const Student& p );  
  11. };  
  12.  
  13. ostream& operator<<( ostream& s, const Student& p )  
  14. {  
  15.      s<<p. m_name<<" "<<p.m_age<<" "<<p. m_scoer;  
  16.      return s;  
  17. }  
  18. // 调用operator<< 
  19. Student XiaoLi("LiLei", 23, 97);  
  20. cout<< XiaoLi;

  当然了,相比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属性的去除(请不要纠结于下面示例函数的“不良”设计):

  1. class CStudent{};  
  2. const CStudent* GetCertainStudent(const std::string& name)  
  3. {  
  4.      CStudent* p = new CStudent(name);  
  5.      return p;  
  6. }  
  7.  
  8. CStudent* p = GetCertainStudent("Li Lei");

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号