effective C++学习---条款2:尽量以const enum inline替换#define

//define定义的常量是属于整个文件,在预编译时进行替换
#define ASPECT_RATIO 1.653
const double AspectRatio = 1.653;
int  f(int a)
{
	return a + 12;
}
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
//写宏调用时一定要将每一个变量都加括号,宏调用会引发一些隐藏问题
void test(){
	int a = 5, b = 10;
	CALL_WITH_MAX(++a, b);//a被加两次
	CALL_WITH_MAX(++a, b + 10);//a倍加一次(调用的过程会因参数而变化)
}
/*
为了避免函数调用产生的尴尬情况,
引入template inline函数
*/
template
inline void callWithMax(const T& a, const T&b)
{
	f(a > b ? a : b);
}


class GamePlayer{
private:
	//这个常量是该类特有的常量,还可以被封装,#define无法完成
	static const int NumTurns = 5;
	int scores[NumTurns];
};
//此处是常量的定义式,不是声明式,在声明处已经赋初值,这里就不需要了
//有的编译器先可以在声明时赋初值,有的要在定义时进行
const int GamePlayer::NumTurns;

/*
在类中用const定义常量,但是这个常量只有在编译运行时才能确定,
如果需要使用这个常量来定义数组,就会有问题了(看具体的编译器)。
然后用enum可以弥补这种缺陷,enum和define比较小相似,还不会导致
非必要的内存分配
*/
class GamePlayer2{
private:
	//enum不能被取地址,这点与define更接近
	enum{NumTurns=5};
	int scores[NumTurns];
};


int  main()
{
	//定义常量指针和指针常量
	const char * const authorName = "Scott Meyers";
	const std::string authorName2("Scott Meyers");
//枚举类型中定义的成员变量可以当成常量直接拿出来使用
	enum 
	{
		red = 0, gree = 1
	}e;
	e = red;
	//enum enn e=gree;
	cout << e << endl;
	
	cout << "red=" << red << endl;

	system("pause");
	return 0;
}

你可能感兴趣的:(C++)