在 C++ 中,const 和 define 均可以用來定義常量。可是這兩者之間有很大的區別:函數
define 的做用線程
用 define 定義的常量是沒有 類型 的,編譯器只是把所定義的常量值和這個常量的名字聯繫起來,編譯器在編譯的過程當中只是把 常量名替換成對應的常量值,全部用到的地方都拷貝替換。指針
const 做用對象
使用 const 定義的常量是 有類型的,這個值存放在了 內存的靜態區域中。內存
具體來講,兩者具備如下這些方面的區別:編譯器
const 定義的常量是能夠使用指針去指向這個值的地址的編譯
是否能定義函數
用 define 能夠定義一些簡單的函數,可是 const 不行class
編譯器處理效率
define 預處理階段替換變量
const 編譯階段替換
類型檢查
define 不檢查類型
const 檢查變量類型
內存空間
define 定義的常量不佔用內存空間
const 定義的常量佔用靜態區域的存儲空間,並且只佔用一個拷貝
其餘
在編譯的時候,編譯器一般不爲const變量分配存儲空間,而是保存在了符號表中,能夠節省內存,這使得它成爲了編譯期間的常量,沒有了頻繁的讀寫內存的操做,效率很高
做用範圍
define 宏定義的做用範圍僅在當前的文件中
const 定義的做用範圍也僅僅在當前文件中,當不一樣的文件中出現了同名的 const 變量的時候,至關於定義了不一樣的變量,同時若是想在多個文件之間共享 const 變量,必須在變量定義以前添加 extern 關鍵字
關於 const 的一些特性
在C++ 中只使用 const 常量而不使用宏常量
const 在類中的做用
若是想在類中共享一個常量,想固然的會使用 const 常量,可是這是不對的,由於 const 常量只在對象的生存期內是常量,可是對於整個類是可變的,由於一個類能夠建立多個對象,不一樣的對象 const 成員的值能夠不一樣。不能再類聲明中初始化 const 數據成員,const 成員變量的初始化只能在構造函數過程當中
static 靜態變量的做用範圍只在一個文件內,程序開始的時候分配空間,程序結束的時候釋放空間,默認初始化的值爲 0,使用過程當中能夠對 靜態變量的值進行修改,靜態變量和靜態函數只有本文件內的代碼才能看見它,它的名字在其餘文件中不可見。
若是一個局部變量被聲明爲靜態變量,那麼將只有惟一的一個靜態分配的對象,它被用於在該函數的全部調用中表示這個變量。這個對象在第一次執行它所在的線程時到達它的定義時初始化。當同時編譯多個文件的時候,全部未加 static 的全局變量和函數都具備全局可見性,若是加了 static,那麼就會對其餘文件隱藏。
對於局部靜態對象,構造函數是在控制線程第一次經過該對象的定義時調用。在程序結束時,局部靜態對象的析構函數將按照他們被構造的相反順序逐一調用,沒有規定確切時間。存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是惟一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不過和全局變量比起來,static能夠控制變量的可見範圍,說到底static仍是用來隱藏的。
若是一個變量是類的一部分,但卻不是該類的各個對象的一部分,它就被成爲是一個static靜態成員。一個static成員只有惟一的一份副本,而不像常規的非static成員那樣在每一個對象裏各有一份副本。同理,一個須要訪問類成員,而不須要針對特定對象去調用的函數,也被稱爲一個static成員函數。類的靜態成員函數只能訪問類的靜態成員(變量或函數)。 static的第三個做用是默認初始化爲0.其實全局變量也具有這一屬性,由於全局變量也存儲在靜態數據區.