从 C 转向 C++
对每个人来说,习惯 C++需要一些时间,对于已经熟悉 C 的程序员来说,
这个过程尤其令人苦恼。因为 C 是 C++的子集,所有的 C 的技术都可以继续使
用,但很多用起来又不太合适。例如,C++程序员会认为指针的指针看起来很
古怪,他们会问:为什么不用指针的引用来代替呢?
C 是一种简单的语言。它真正提供的只有有宏、指针、结构、数组和函数。
不管什么问题,C 都靠宏、指针、结构、数组和函数来解决。而 C++不是这样。
宏、指针、结构、数组和函数当然还存在,此外还有私有和保护型成员、函数
重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、
模板、异常、名字空间,等等。用 C++比用 C 具有更宽广的空间,因为设计时
有更多的选择可以考虑。
在面对这么多的选择时,许多 C 程序员墨守成规,坚持他们的老习惯。一
般来说,这也不是什么很大的罪过。但某些 C 的习惯有悖于 C++的精神本质,
他们都在下面的条款进行了阐述。
条款 1:尽量用 const 和 inline 而不用#define
这个条款最好称为:“尽量用编译器而不用预处理”,因为#define 经常被认
为好象不是语言本身的一部分。这是问题之一。再看下面的语句:
#define ASPECT_RATIO 1.653
编译器会永远也看不到 ASPECT_RATIO 这个符号名,因为在源码进入编译器
之前,它会被预处理程序去掉,于是 ASPECT_RATIO 不会加入到符号列表中。
如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指
的是 1.653,而不是 ASPECT_RATIO。如果 ASPECT_RATIO 不是在你自己写