这个item也可以理解成“选择编译器而不是预编译”。下面的预编译
#define RATIO 1.653
符号RATIO在代码进入编译器前就被预编译移走了,所以RATIO根本不会出现在符号表里,出现错误也不好寻找,替代方案是用const定义常数, const float Ratio =1.653;(非预编译时一般不用大写)。符号Ratio会被编译器看到,进入符号表。
在定义指针常量时有所不同,需要两个const
const char * const p ="effective";
|
很麻烦,也不方偏,这种情况可以使用string类型
const std::string s("effective");
|
如果想使用类的常量,那么只能是将某个类的成员声明为静态,
class EC{
public:
static const int i=5;
};
|
因为是const类型,所以要该类成员定义时赋初值,这样我们可以直接使用这个静态成员
int main(){
cout<<EC::i<<endl;
}
|
而如果在定义时没有赋初值
class EC{
public:
static const int i;
};
|
那我们在使用前就要手动将这个静态变量初始化一下
const int EC::i=6;
int main(){
cout<<EC::i<<endl;
}
|
预编译#define还可以定义某些类似函数的东西,例如
#define Max(a,b) ((a)>(b)?(a):(b))
这种地方很容易犯错误,尤其是当传入表达式的时候
#define Max(a,b) ((a)>(b)?(a):(b))
int main(void) {
int a=3,b=1;
cout<<Max(++a,b)<<endl;
cout<<"a= "<<a<<" b= "<<b<<endl;
}
|
输出结果为
5
a= 5 b= 1
a被加了两次,因为++a比b大,如果比b小,只会加1次。
解决这样的宏定义是使用内联函数。
template<typename T> // because we don't
inline const T callWithMax(const T& a, const T& b) // know what T is, we
{ // pass by reference-to-
return(a > b ? a : b); // const — see Item 20
}
|
阅读(627) | 评论(0) | 转发(0) |