目錄
- 1. 總結
- 2. 使用const常量或enum替換宏常量
- class外部的常量指標
- class專屬常量
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成員變數,
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];
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/73339.html
標籤:C++
上一篇:條款01:視C++為一個語言聯邦
下一篇:條款03:盡可能使用const
