前面的 Effective C++ 解析 1 说明了条款 3 和 5 那么下面继续来说明其他条款!
Effecive C++ 解析2:将解析条款1 和 条款2
条款 1:尽量用 const和inline而不用#define(其他名字:尽量用编译器而不用预处理)
原因 1:编译器的预处理 导致,例:#defineASPECT_RATIO 1.653 这个常量的代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是 ASPECT_RATIO。
解决方案:不用预处理宏,定义一个常量:constdouble ASPECT_RATIO = 1.653;
注意点:两个特殊情况要注意
1: 定义指针常量时会有点不同。因为常量定义一般是放在头文件中(许多源文件会包含它),除了指针所指的类型要定义成 const外,重要的是指针也经常要定义成 const。例如,要在头文件中定义一个基于 char*的字符串常量,你要写两次
const: const char * constauthorName = "Scott Meyers";
关于 const的含义和用法,特别是和指针相关联的问题,参见条款 21(待更新)。
2 :定义某个类(class)的常量一般也很方便,只有一点点不同。要把常量限制在类中,首先要使它成为类的成员;为了保证常量最多只有一份拷贝,还要把它定义为静态成员:
class GamePlayer { private: static const int NUM_TURNS = 5; // constant declaration int scores[NUM_TURNS]; // use of constant ... };
原因 2:#define指令的用法是用它来实现那些看起来象函数而又不会导致函数调用的宏
例子:#define max(a,b) ((a) > (b) ? (a) : (b))
1 语句有很多缺陷,好比在高峰时间到高速公路去开车还让人痛苦
如:
nt a = 5, b = 0; max(++a, b); // a 的值增加了2次 max(++a, b+10); //a 的值只增加了1次解决方法:
inlineint max(int a, int b) { return a > b ? a : b; }更优美的方法:
template<class T> inline const T& max(const T& a, const T& b) { return a > b ? a : b; }
这个模板产生了一整套函数,每个函数拿两个可以转换成同种类型的对象进行比较然后返回较大的(常量)对象的引用。因为不知道T的类型,返回时传递引用可以提高效率(见 Effective条款22:待更新)。
条款 2:尽量用<iostream>而不用<stdio.h>
原因:scanf和printf 他们不是类型安全的,而且没有扩展性,因为类型安全和扩展性是C++的基石。
借用Effective 此书中例子:
class Rational { public: Rational(int numerator = 0, int denominator = 1); ... private: int n, d; // 分子,分母 friend ostream& operator<<(ostream& s, const Rational& r); }; ostream& operator<<(ostream& s, const Rational& r) { s << r.n << ‘/‘ << r.d; return s; }
第一,有些iostream的操作实现起来比相应的C stream效率要低,所以不同的选择会给你的程序有可能(虽然不一定,参见条款M16)带来很大的不同。但请牢记,这不是对所有的iostream而言,只是一些特殊的实现。
第二,在标准化的过程中,iostream库在底层做了很多修改(参见条款49),所以对那些要求最大可移植性的应用程序来说,会发现不同的厂商遵循标准的程度也不同。
第三,iostream库的类有构造函数而<stdio.h>里的函数没有,在某些涉及到静态对象初始化顺序的时候,如果可以确认不会带来隐患,用标准 C库会更简单实用。
说了那么多,无非感觉一个使用函数一个是操作对象,方便性可想而知。