Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300226
  • 博文数量: 148
  • 博客积分: 4365
  • 博客等级: 上校
  • 技术积分: 1566
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:38
文章分类
文章存档

2014年(2)

2013年(45)

2012年(18)

2011年(1)

2009年(54)

2008年(28)

我的朋友

分类: C/C++

2008-12-08 11:35:04

这个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) |
给主人留下些什么吧!~~