關鍵字 分節10(const)

2021-07-23 13:36:38 字數 2336 閱讀 9519

const 關鍵字也許該被替換為readolny

const 是constant 的縮寫,是恆定不變的意思,也翻譯為常量、常數等。很不幸,正是

因為這一點,很多人都認為被const 修飾的值是常量。這是不精確的,精確的說應該是唯讀 的變數,其值在編譯時不能被使用,因為編譯器在編譯時不知道其儲存的內容。或許當初 這個關鍵字應該被替換為readonly。那麼這個關鍵字有什麼用處和意義呢?

const 推出的初始目的,正是為了取代預編譯指令,消除它的缺點,同時繼承它的優點。 我們看看它與define 巨集的區別。(很多人誤以為define 是關鍵字,在這裡我提醒你再回到本 章前面看看32 個關鍵字裡是否有define)。

const 修飾的唯讀變數

定義const 唯讀變數,具有不可變性。 例如:

const intmax=100; intarray[max];

這裡請在visual c++6.0 裡分別建立.c 檔案和.cpp 檔案測試一下。你會發現在.c 檔案中, 編譯器會提示出錯,而在.cpp 檔案中則順利執行。為什麼呢?我們知道定義乙個陣列必須指

定其元素的個數。這也從側面證實在c 語言中,const 修飾的max 仍然是變數,只不過是只

讀屬性罷了;而在c++裡,擴充套件了const 的含義,這裡就不討論了。 注意:const 修飾的唯讀變數必須在定義的同時初始化。

節省空間,避免不必要的記憶體分配,同時提高效率

編譯器通常不為普通const 唯讀變數分配儲存空間,而是將它們儲存在符號表中,這使 得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高。 例如:

#define m 3 //巨集常量

const int n=5; //此時並未將n 放入記憶體中

int i=n; //此時為n 分配記憶體,以後不再分配! int i=m; //預編譯期間進行巨集替換,分配記憶體 int j=n; //沒有記憶體分配

int j=m; //再進行巨集替換,又一次分配記憶體!

const 定義的唯讀變數從彙編的角度來看,只是給出了對應的記憶體位址,而不是象#define 一樣給出的是立即數,所以,const 定義的唯讀變數在程式執行過程中只有乙份拷貝(因為 它是全域性的唯讀變數,存放在靜態區),而#define 定義的巨集常量在記憶體中有若干個拷貝。 #define 巨集是在預編譯階段進行替換,而const 修飾的唯讀變數是在編譯的時候確定其值。 #define 巨集沒有型別,而const 修飾的唯讀變數具有特定的型別。

修飾一般變數

一般常量是指簡單型別的唯讀變數。這種唯讀變數在定義時,修飾符const 可以用在類 型說明符前,也可以用在型別說明符後。例如: int const i=2; 或const int i=2;

修飾陣列

定義或說明乙個唯讀陣列可採用如下格式: int const a[5]=;或 const int a[5]=;

修飾指標

const int *p; // p 可變,p 指向的物件不可變 int const *p; // p 可變,p 指向的物件不可變 int *const p; // p 不可變,p 指向的物件可變

const int *const p; //指標p 和p 指向的物件都不可變

在平時的授課中發現學生很難記住這幾種情況。這裡給出乙個記憶和理解的方法:

先忽略型別名(編譯器解析的時候也是忽略型別名),我們看const 離哪個近。「近水樓 台先得月」,離誰近就修飾誰。

const int *p; //const 修飾*p,p 是指標,*p 是指標指向的物件,不可變 int const *p; //const修飾*p,p 是指標,*p 是指標指向的物件,不可變 int *const p; //const修飾p,p 不可變,p 指向的物件可變

const int *const p; //前乙個const 修飾*p,後乙個const 修飾p,指標p 和p 指向的物件 都不可變

修飾函式的引數

const 修飾符也可以修飾函式的引數,當不希望這個引數值被函式體內意外改變時使 用。例如:

void fun(const int i);

告訴編譯器i 在函式體中的不能改變,從而防止了使用者的一些無意的或錯誤的修改。

修飾函式的返回值

const 修飾符也可以修飾函式的返回值,返回值不可被改變。例如: const int fun (void);

在另一連線檔案中引用const 唯讀變數: extern const int i; //正確的宣告

extern const int j=10; //錯誤!唯讀變數的值不能改變。

注意這裡是宣告不是定義,關於宣告和定義的區別,請看本章開始處。

講了這麼多講完了嗎?遠沒有。在c++裡,對const 做了進一步的擴充套件,還有很多知識未能 講完。有興趣的話,不妨查詢相關資料研究研究。

關鍵字 分節4(sizeof)

常年被人誤認為函式sizeof sizeof 是關鍵字不是函式,其實就算不知道它是否為32 個關鍵字之一時,我們也可以 借助編譯器確定它的身份。看下面的例子 int i 0 a sizeof int b sizeof i c sizeof int d sizeof i 毫無疑問,32 位系統下a b...

關鍵字 分節18(typedef)

有這樣乙個笑話 乙個獵人在河邊抓捕一條蛇,蛇逃進了水裡。過一會,乙個烏龜爬到岸邊。獵人一把抓住這個烏龜,大聲的說道 小樣,別你為你穿了個馬甲我就不認識你 了!typedef 關鍵字是個偉大的縫紉師,擅長做馬甲,任何東西穿上這個馬甲就立馬變樣。它可以把狼變成一頭羊,也能把羊變成一頭狼。甚至還可以把長著...

const關鍵字用法

1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...