天天看點

條款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);

     }