许久以来,在程序设计的世界里我一直处于羸弱的姿态,习得代码的外貌却深入不到它的精髓,对于一些设计技巧基本不去研究,因此代码看起来毫无章法,混乱至极。要想成为一个大师级人物,就要有章有法,写出有意味的code。因此决心潜下心来学习c++程序的设计技巧,通过几本书来学习它,完善自身。
门外万物皆是空,应以不变应万变。
替换#define,并不是替换所有的#define,而是某些情况下#define显得并不怎么规范,且会造成代码的混乱,这是应该遭受禁止的。
#define TEMP 1.56 ,当你做出这个事的时候,是采用了预处理器,程序在编译前,所有的TEMP会被替换成1.56,所以当编译出现错误时,编译器显示的错误信息为1.56,而不会是TEMP,这会造成困扰。
一种解决方法是,使用const来替换上述的宏(#define) const double TEMP = 1.56;
当 宏为 #define TEMP "darren" 时,应以 const char * const TEMP = "darren"; 来代替,或使用string对象: const std::string TEMP("darren"); 来代替。
在c++中,有时我们需要在类中声明一个数组 array成员,数组的大小一般也被定义死了,你可能会这么定义:
#define TEMP 5
class A
{
……
private:
array[TEMP];
}
可用enum来代替这种宏的写法。
class A
{
……
private:
enum{ Num = 5}; //令Num成为5的一个记号名称
array[Num];
}
这种写法其实更为常见,比较实用。
#define还经常用于实现类似于函数的宏,如: #define GET_MAX(a,b) f( (a) > (b) ? (a) : (b) )
这样的宏,真的很难看,据说它还会出现下述的bug:
int a = 5, b = 0;
GET_MAX(++a,b) //a被累加2次;
GET_MAX(++a,b+10) //a被累加1次;
这宏太危险了,直接用函数代替就好,用template inline 函数代替就显得简洁得多:
template<typename T>
inline void GET_MAX(const T& a, const T& b)
{
f( a > b? a : b );
}
这个模板函数将产生出一堆来比较相同类型的参数大小的函数,够用了。