1. 程式人生 > >const、define 和 static 的區別

const、define 和 static 的區別

[TOC] # define、const 在 C++ 中,const 和 define 都可以用來定義常量。但是這二者之間有很大的區別: * define 的作用 用 define 定義的常量是沒有 **型別** 的,編譯器只是把所定義的常量值和這個常量的名字聯絡起來,編譯器在編譯的過程中只是把 **常量名替換成對應的常量值**,所有用到的地方都拷貝替換。 * const 作用 使用 const 定義的常量是 **有型別**的,這個值存放在了 **記憶體的靜態區域**中。 具體來說,二者具有以下這些方面的區別: 1. **是否能用指標** 用 define 定義的常量是不能用指標去指向該值的,因為只是簡單的替換 const 定義的常量是可以**使用指標**去指向這個值的地址的 2. **是否能定義函式** 用 define 可以定義一些簡單的函式,但是 const 不行 3. **編譯器處理** define 預處理階段替換 const 編譯階段替換 4. **型別檢查** define 不檢查型別 const 檢查變數型別 5. **記憶體空間** define 定義的常量不佔用記憶體空間 const 定義的常量佔用靜態區域的儲存空間,而且只佔用一個拷貝 6. **其他** 在編譯的時候,**編譯器通常不為const變數分配儲存空間,而是儲存在了符號表中**,可以節省記憶體,這使得它成為了編譯期間的常量,沒有了頻繁的讀寫記憶體的操作,效率很高 7. **作用範圍** define 巨集定義的作用範圍僅在當前的檔案中 const 定義的作用範圍也僅僅在當前檔案中,當不同的檔案中出現了同名的 const 變數的時候,相當於定義了不同的變數,同時如果想在多個檔案之間共享 const 變數,必須在變數定義之前新增 **extern** 關鍵字 關於 const 的一些特性 **在C++ 中只使用 const 常量而不使用巨集常量** 1. **const 在類中的作用** 如果想在類中共享一個常量,想當然的會使用 const 常量,但是這是不對的,因為 const 常量只在物件的生存期內是常量,但是對於整個類是可變的,因為一個類可以建立多個物件,不同的物件 const 成員的值可以不同。**不能再類宣告中初始化 const 資料成員**,const 成員變數的初始化只能在建構函式過程中 # static static 靜態變數的作用範圍只在一個檔案內,程式開始的時候分配空間,程式結束的時候釋放空間,預設初始化的值為 0,使用過程中可以對 靜態變數的值進行修改,靜態變數和靜態函式只有本檔案內的程式碼才能看見它,它的名字在其他檔案中不可見。 1. **在函式內部宣告 static 變數,static 變數可以當作物件間的一種通訊機制** 如果一個區域性變數被宣告為靜態變數,那麼將只有唯一的一個靜態分配的物件,它被用於在該函式的所有呼叫中表示這個變數。這個物件在第一次執行它所在的執行緒時到達它的定義時初始化。當同時編譯多個檔案的時候,所有未加 static 的全域性變數和函式都具有全域性可見性,**如果加了 static,那麼就會對其他檔案隱藏**。 2. **區域性靜態物件** 對於區域性靜態物件,建構函式是在控制執行緒第一次通過該物件的定義時呼叫。在程式結束時,區域性靜態物件的解構函式將按照他們被構造的相反順序逐一呼叫,沒有規定確切時間。**儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數,只不過和全域性變數比起來,static可以控制變數的可見範圍,說到底static還是用來隱藏的**。 3. **靜態成員和靜態成員函式** 如果一個變數是類的一部分,但卻不是該類的各個物件的一部分,它就被成為是一個static靜態成員。一個static成員只有唯一的一份副本,而不像常規的非static成員那樣在每個物件裡各有一份副本。同理,一個需要訪問類成員,而不需要針對特定物件去呼叫的函式,也被稱為一個static成員函式。類的靜態成員函式只能訪問類的靜態成員(變數或函式)。 static的第三個作用是預設初始化為0.其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態