条款2:尽量以const, enum, inline 替换#define

      用#define定义的常量如:#define RAT  0.35 当运行此常量但获得一个编译错误信息时,这个错误信息也许会提到

0.35而不是RAT。如果RAT被定义到一个不熟悉的头文件里,将会浪费时间而去追踪它。因此这里不建议使用#define

 解决的方法就是用一个const 定义的常量替换这个宏:const double Rat = 0.35;

       两种特殊的情况:

          第一是定义常量指针,如 const char* const Name = "Scott Meyers";,而利用string则可以这样定义:const std::string Name("Scott Meyers");

         第二是class专属常量。为了将常量的作用域限制在class内,必须让它成为class的一个成员,而为了确保此常量至多只有一份实体,必须让它成为一个static 成员:

        class GamePlayer

        {

         private:

               static const int NumTurns = 5;           //常量声明式

               int scores[NumTurns];

         };

         const int GamePlayer::NumTurns;        //常量定义式,因为在声明时已经获得初值,因此定义时不能再设初值

 

       利用enum可以获得同样的效果:

       class GamePlayer

        {

         private:

               enum{NumTurns = 5};          

               int scores[NumTurns];

         };

        有的旧编译器不支持const在声明时设置初值,因此使用enum可以避免这个问题。enum 的行为某方面比较像#define而不像const,例如取一个const的地址是合法的,但取一个enum的地址就是不合法的,和#define相似。

 

      利用inline可以替换类似函数的宏。如 #define CALL_MAX(a,b) f((a) > (b) ? (a) : (b))

      template<typename T>

      inline void callMax(const T& a, const T& b)

     {

               f(a > b ? a : b);

     }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值