1、宏定義
#define DEMO 10
這種方式定義的常量,在編譯時,編譯器看不到DEMO這個名稱,在預處理的時候都被替換了。於是DEMO沒有進入符號表內,這樣,在運用此常量的地方出現編譯錯誤時,錯誤信息不會提到DEMO,會導致難以定位錯誤信息。另外在進行調試時,也看不到DEMO名稱。
2、const常量定義
(1)const定義普通常量
const int demo = 10;
const char* const pDemo = "hello world";
const有內鏈接屬性,所以在頭文件中這樣定義常量時,不會出現多個編譯單元次引用頭文件時出現鏈接錯誤。並且一般的編譯器會給const變量只分配一個存儲空間。
(2)const定義類專屬常量
class Demo{
private:
static const int demo = 10; //常量聲明式,static確保此常量在類中只有一份實體
int arrDemo[demo]; //使用該常量
};
class中的是聲明式(對於整數常量可以進行in-class初值設定,所以在聲明式中給初值10),必須在cpp文件中給出定義式:
const int Demo::demo;
有的編譯器不允許static成員在聲明式中給初值,就只能在定義的時候給初值。
3、enum定義常量
enum { DEMO = 10, };
去const常量的地址是合法的,但是取enum的地址不合法。