C 回顧 常量

2021-08-21 05:45:47 字數 2233 閱讀 6863

一、值替代

要使用const而非#define,必須把const定義放進標頭檔案裡。這樣,通過包含標頭檔案,可把const定義單獨放在乙個地方並把它分配給乙個編譯單元。c++中的const預設為內部連線(c中預設是外部連線),也就是說,const僅在const被定義過的檔案裡才是可見的,而在連線時不能被其他編譯單元看到。當定義乙個const時,必須賦乙個值給它,除非用extern作出了清除的說明。

通常c++編譯器並不為const建立儲存空間,相反它把這個定義儲存在它的符號表裡。但是,extern強制進行了儲存空間分配,另外,如取乙個const的位址,也要進行儲存空間分配。

想絕對不為任何const分配儲存是不可能的,所以const的定義必須預設為內部連線。在大部分場合使用內部資料型別的情況,包括常量表示式,編譯器都能執行常量摺疊(在編譯階段,對該變數進行值替換,同時,該常量擁有自己的儲存空間,並非像巨集定義一樣不分配儲存空間)。

const的作用不僅侷限於在常數表示式裡代替#define,如果用執行期間產生的值初始化乙個變數且知道在變數生命期內是不變的,則用const限定該變數,如果試圖改變它,編譯器會報錯。這樣做,也消除了讀儲存器和讀記憶體操作,使編譯器產生的**更有效。

const可以用於集合(必須分配記憶體),在這種情況下,const意味著「不能改變的一塊儲存空間」。

二、const修飾指標

當使用帶有指標的const時,有兩種選擇:1)const修飾指標正指向的物件;2)const修飾在指標裡儲存的位址。

1、指向const的指標

const修飾「最靠近」它的那個(在識別符號的開始處讀它並從裡向外讀)。

const int * u; // u是乙個指標,它指向乙個const int

u可以指向任何識別符號,但它所指的值是不能被改變的。

int const * u; // u是乙個指向const的int的普通指標

這裡,const又把它自己與int結合在一起,效果與前面定義一樣。為使程式更具有可讀性,應堅持用第一種形式。

2、const指標

使指標本身成為乙個const指標,必須把const標明的部分放在*的右邊。

int i = 8;

int * const w = &i;

w是乙個指標,這個指標是指向int的const指標。所以編譯器要求給它乙個初始值,這個值在指標生命期內不變,然而可以改變它所指向的值。

可以使用下面兩種形式中的任何一種把乙個const指標指向乙個const物件:

int i = 8;

const int * const x = &i;

int const * const x2 = &i;

c++關於型別檢查是非常嚴格的。可以把乙個非const物件的位址賦給乙個const指標,但是不能把乙個const物件的位址賦給乙個非const指標。

字元陣列的字面值:常量字元陣列。

三、const修飾函式引數和返回值

1、傳遞const值

如果函式引數是按值傳遞,則可用const修飾

2、返回const值

如果乙個函式按值返回乙個類物件為const時,那麼這個函式的返回值不能是乙個左值(即它不能被賦值,也不能被修改)。編譯器建立的臨時變數自動成為const。

四、const修飾類

在乙個類裡建立乙個普通的(非static)const時,不能給它初始化,這個初始化工作必須在建構函式裡進行。

類裡面建立乙個static const,必須在定義的地方對它進行初始化。因此,它可以看做乙個編譯期間的常量(不管類的物件被建立多少次,這個常量成員都只有乙個例項)

如果宣告乙個成員函式為const(把修飾符const放在函式引數表的後面,而且必須以同樣的方式重複出現在定義裡),則等於告訴編譯器該成員可以為乙個const物件所呼叫。乙個沒有被明確宣告為const的成員函式被看成是將要修改物件中資料成員的函式,而且編譯器不允許它為乙個const物件所呼叫。不修改資料成員的任何函式都應該把它們宣告為const,這樣它可以和const物件一起使用。

按位const:物件中的每個位元組都是固定的,所以物件的每個位映像從不改變(當編譯器被告知乙個物件是const物件時,它將絕對保護這個物件按位的常量性)。

按邏輯const:雖然整個物件從概念上講是不變的,但是可以以成員為單位改變。在類宣告裡使用關鍵字mutable,以指定乙個特定的資料成員可以在乙個const物件裡被改變。

具有唯讀儲存能力的const物件,有以下要求:

1)沒有使用者定義的建構函式或析構函式

2)不能有基類,也不能包含有使用者定義建構函式和析構函式的成員物件。

C 常量指標 指標常量

const char p 常量指標,指向一塊區域,這塊區域不可寫,只能讀。char const p 指標常量,指向一塊區域,這塊區域可讀可寫,但是指標的值初始後就不能改,類似於一般常量。const char const p 上面兩種型別的綜合,指標指向的區域不可寫,可讀。指標初始化後不能改。至於有什...

C 常量指標 指標常量

常量指標 顧名思義就是指向常量的指標。使用常量指標可以防止使用該指標來修改所指向的值。宣告形式為const type pt 或type const pt 不希望函式內部修改引數的值 或者說是函式呼叫的值 例如求和但不希望改變原來的值 intsum const int pa,const int pb ...

C 變數 常量 符號常量

變數 int i 0 i 是變數 i 5 i 可以修改 變數就是程式內乙個記憶體位置的符號名,在該記憶體位置可以儲存資料,並可以通過符號名對該記憶體位址存放的資料進行訪問。變數的值可以修改,是可變的,但在某個確定的時刻,變數的值是確定的,並一直保持到下次被修改之前。常量 int a 10 a 是變數...