EffectiveC++ 学习笔记1

条款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++标准库。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值