const 是constant的縮寫,是恆定不變的意思,也常翻譯為常量、常數等。很不幸,正是因為這一點,很多人都認為被const修飾的值是常量。這是不精確的,精確的說應該是唯讀的變數,其值在編譯時不能被使用,因為編譯器在編譯時不知道其儲存的內容。那麼這個const 關鍵字有什麼用處和意義呢?
const 推出的初始目的,正是為了取代預編譯指令,消除它的缺點,同時繼承它的優點。
1、const修飾的唯讀變數
定義const 唯讀變數,具有不可變性。
例如:
const int max=100;
int array[max];
這裡如果分別建立.c 檔案和.cpp 檔案測試一下,你就會發現在.c 檔案中,編譯器會提示出錯,而在.cpp 中則順利執行,為什麼呢?我們知道定義乙個陣列必須指定其元素的個數。這也從側面證實在c語言中,const 修飾的max仍然是變數,只不過是唯讀屬性,而在c++中,擴充套件了const 的含義。
注意:const 修飾的唯讀變數必須在定義的同時初始化。
問題:那麼case 語句後面是否可以是const 修飾的唯讀變數呢?
很顯然是不可以的,case 語句後必須是乙個常量,const 修飾的唯讀變數仍然是變數,所以是不可以的,大家也可以動手試試看。
2、節省空間,避免不必要的記憶體分配,同時提高效率
編譯器通常不為普通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 定義的巨集常量在記憶體中有若干個拷貝
在編譯的時候確定其值
#define 巨集是在預編譯階段進行替換
const 修飾的唯讀變數具有特定的型別
#define 巨集沒有型別
3、修飾一般變數
一般常量是指簡單型別的唯讀變數。這種唯讀變數在定義時,修飾符const可以用在型別說明符前,也可以用在型別說明符後。例如:
int const i=2;
或 const int i=2;
4、修飾陣列
定義或說明乙個唯讀陣列可採用如下格式:
int const a[5]=; 或
const int a[5]=;
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指向的物件都不可變
6、修飾函式的引數
const 修飾符也可以修飾函式的引數,當不希望這個引數值被函式體內一位改變時使用。例如:
void fun(const int i);
告訴編譯器i在函式體中的值不能改變,從而防止了使用者的一些無意的或錯誤的修改。
7、修飾函式的返回值
const 修飾符也可以修飾函式的返回值,返回值不可被改變。例如:
const int fun(void);
在另一連線檔案中引用const 唯讀變數:
extern const int i; //正確的宣告
extern const int j=10;//錯誤!唯讀變數的值不能改變
注意這裡是宣告不是定義
const關鍵字用法
1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...
const關鍵字用法
const修飾符表示該變數的值不能被改變。但得分兩種情況討論 修飾普通變數和修飾指標變數。1.普通常量 const int foo 5 表示foo不能再被賦值 foo 8 錯誤,因為foo是const修飾為不可變常量了 2.修飾指標 const char p test 表示p指向 的記憶體不可改變,...
C語言關鍵字 Const
c中const的使用 雖然這聽起來很簡單,但實際上,const的使用也是c語言中乙個比較微妙的地方,微妙在何處呢?請看下面幾個問題。問題 const變數 常量 為什麼下面的例子在使用乙個const變數來初始化陣列,ansi c的編譯器會報告乙個錯誤呢?const int n 5 int a n 答案...