條款02:儘可能以const,enum,inline替換#define

1. 總結

  • 對於單純常量,最好以const常量或enum替換#define
  • 對於宏代碼段,最好改用inline函數替換#define

2. 使用const常量或enum替換宏常量

當咱們以const常量替換#define,有兩種特殊狀況值得說說。函數

class外部的常量指針

第一種是定義class外部的常量指針,這種常量定義式一般放在頭文件內以便被不一樣的源文件使用,所以有必要將指針自己聲明爲const。
例如要在頭文件內定義一個常量char *-based字符串,必須寫兩次const(左數右指),以下所示。指針

const char *const authorName = "Scott Meyers";  //必須寫兩次const,左數右指
const std::string authorName("Scott Meyers");   //更好的作法是採用string類型

class專屬常量

第二個值得注意的是class專屬常量,爲了確保該常量最多隻有一份實體,必須讓它成爲static成員變量。code

class GamePlayer
{
private:
    static const int NumTurns = 5;  //常量聲明式,而非定義式
    int scores[NumTurns];           //使用該常量
};

注意,該示例中展現的是NumTurns的聲明式而非定義式,定義式應按照類的static成員變量的語法要求在.cpp文件中進行。
但若是一個常量既是class專屬常量又是static且爲整數類型(int、char、bool等),則需特殊處理,只要不取它們的地址,你能夠聲明並使用它們而無需提供定義式。
注意,in-class初值設定只適用於static整數常量,並且即便是static整數常量,有些編譯器也可能不支持這種操做,遇到這種狀況,能夠將初值放在定義式中。字符串

class GamePlayer
{
private:
    static const double FudgeFactor;  //非整數常量,沒法進行-in-class初值設定
    static const int NumTurns;        //即便是整數常量,編譯器也可能不支持in-class初值設定
};

//static常量定義,位於.cpp文件
const double GamePlayer::FudgeFactor = 1.35;
const int GamePlayer::NumTurns = 5;

若是編譯器不支持static整數常量的in-class初值設定,但該常量又必須在class編譯期間使用,如GamePlayer::scores數組大小,可改用enum代替const。編譯器

class GamePlayer
{
private:
    enum { NumTurns = 5 };
    int scores[NumTurns];
};
相關文章
相關標籤/搜索