条款1:尽量使用const和inline而不用#define
(尽量使用编译器而不是预处理,方便找错)
第一部分:const常量的定义
需要注意的两点:
1.定义指针常量的时候
a.指针是常量的,要定义成const
b.指针所指的类型要定义成const
例如:
const char* const authorName = "Scott Meyers";
2.类中的常量(静态的类常量成员变量)
class GamePlayer
{
private:
static const int NUM_TURNS = 5; //注意:这里仅仅只是声明
int score[NUM_TURNS ]; //使用常量
.....
}
还需在cpp文件中定义:
const int GamePlayer::NUM_TURNS;
注:旧的编译器可能不支持这种语法,他们认为:
1)类的静态成员变量在声明时定义初值是非法的。
2)类内只允许初始化整数的常量类型(如:int,bool,char等)。
注:VS2012中提示:只有静态常量整型数据成员才可以在类中初始化。
如果编译器否定了以上的写法,可在cpp文件定义初值:
头文件:
class GamePlayer
{
private:
static const int NUM_TURNS; //注意:这里仅仅只是声明
int score[NUM_TURNS ]; //报错:常量NUM_TURNS未被初始化}
cpp文件:
const int GamePlayer::NUM_TURNS = 5;
上面的例子会报错,因为编译器在编译类的时候,并不知道常量NUM_TURNS是多少,正确的写法是:
class GamePlayer
{
private:
static const int NUM_TURNS = 5; //初始化
int score[NUM_TURNS ];
}
技巧:
如果类在编译时候需要用到某个常量(如编译过程中,编译器一定要知道数组大小),可利用枚举变量:
class GamePlayer
{
private:
enum{NUM_TURNS = 5};
int score[NUM_TURNS ]; //使用常量
.....
}
第二部分:内联函数
#define的另一个用法:用来实现看似函数又不是函数的调用,如
#define max(a,b) ((a) > (b) ? (a) : (b)) ;
注:必须对宏体的每个参数加上括号,否则别人在表达式中调用你的宏就会很麻烦。
奇怪的现象:
int a = 5,b=0;
max(++a, b); // a 的值增加了 2 次
max(++a, b+10); // a 的值只增加了 1 次
具体为什么自己体会(╯‵□′)╯︵┻━┻
例如
temple<class T>
inline const T& max(const T& a, const T& b)
{
return a > b ? a : b;
}
注:因为不知道T的类型,所以传递引用可以提高效率。
max函数已加入C++标准库。