程式語言 const限定詞的用法

2021-06-28 20:38:18 字數 4048 閱讀 3130

物件導向是c++的重要特性.

但是c++在c的基礎上新增加的幾點優化也是很耀眼的

就const直接可以取代c中的#define

以下幾點很重要,學不好後果也也很嚴重

const

1. 限定符宣告變數只能被讀

const int i=5;

int j=0;

...i=j;   //非法,導致編譯錯誤

j=i;   //合法

2. 必須初始化

const int i=5;    //合法

const int j;      //非法,導致編譯錯誤

3. 在另一連線檔案中引用const常量

extern const int i;     //合法

extern const int j=10;  //非法,常量不可以被再次賦值

4. 便於進行型別檢查

用const方法可以使編譯器對處理內容有更多了解。

#define i=10

得在const long i=10; 時i不被分配記憶體,而是已10直接代入

以後的引用中,以致在以後的**中沒有錯誤,為達到說教效

果,特別地用&i明確地給出了i的記憶體分配。不過一旦你關閉所

有優化措施,即使const long i=10;也會引起後面的編譯錯誤。*/

char h=i;      //沒有錯

char h=i;      //編譯警告,可能由於數的截短帶來錯誤賦值。

5. 可以避免不必要的記憶體分配

#define string "abcdefghijklmn "

const char string="abcdefghijklm ";

...printf(string);   //為string分配了第一次記憶體

printf(string);   //為string一次分配了記憶體,以後不再分配

...printf(string);   //為string分配了第二次記憶體

printf(string);

... 

由於const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,

而不是象#define一樣給出的是立即數,所以,const定義的常量在

程式執行過程中只有乙份拷貝,而#define定義的常量在記憶體中有

若干個拷貝。

6. 可以通過函式對常量進行初始化

int value(); 

const int i=value();

dapingguo說:假定對rom編寫程式時,由於目標**的不可改寫,

本語句將會無效,不過可以變通一下:

const int &i=value();

值有不會被修改。

7. 是不是const的常量值一定不可以被修改呢?

const int i=0;

int *p=(int*)&i;//這裡必須有強制型別轉換

*p=100;

通過強制型別轉換,將位址賦給變數,再作修改即可以改變const常量值。

8. 請分清數值常量和指標常量,以下宣告頗為玩味:

int ii=0;

const int i=0;            //i是常量,i的值不會被修改

const int *p1i=&i;        //指標p1i所指內容是常量,可以不初始化

int  * const p2i=ⅈ     //指標p2i是常量,所指內容可修改

const int * const p3i=&i; //指標p3i是常量,所指內容也是常量

p1i=ⅈ                  //合法

*p2i=100;                 //合法

const幾點用法 

2023年 01月08日 

物件導向是c++的重要特性.

但是c++在c的基礎上新增加的幾點優化也是很耀眼的

就const直接可以取代c中的#define

以下幾點很重要,學不好後果也也很嚴重

const

1. 限定符宣告變數只能被讀

const int i=5;

int j=0;

...i=j;   //非法,導致編譯錯誤

j=i;   //合法

2. 必須初始化

const int i=5;    //合法

const int j;      //非法,導致編譯錯誤

3. 在另一連線檔案中引用const常量

extern const int i;     //合法

extern const int j=10;  //非法,常量不可以被再次賦值

4. 便於進行型別檢查

用const方法可以使編譯器對處理內容有更多了解。

#define i=10

得在const long i=10; 時i不被分配記憶體,而是已10直接代入

以後的引用中,以致在以後的**中沒有錯誤,為達到說教效

果,特別地用&i明確地給出了i的記憶體分配。不過一旦你關閉所

有優化措施,即使const long i=10;也會引起後面的編譯錯誤。*/

char h=i;      //沒有錯

char h=i;      //編譯警告,可能由於數的截短帶來錯誤賦值。

5. 可以避免不必要的記憶體分配

#define string "abcdefghijklmn "

const char string="abcdefghijklm ";

...printf(string);   //為string分配了第一次記憶體

printf(string);   //為string一次分配了記憶體,以後不再分配

...printf(string);   //為string分配了第二次記憶體

printf(string);

... 

由於const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,

而不是象#define一樣給出的是立即數,所以,const定義的常量在

程式執行過程中只有乙份拷貝,而#define定義的常量在記憶體中有

若干個拷貝。

6. 可以通過函式對常量進行初始化

int value(); 

const int i=value();

dapingguo說:假定對rom編寫程式時,由於目標**的不可改寫,

本語句將會無效,不過可以變通一下:

const int &i=value();

值有不會被修改。

7. 是不是const的常量值一定不可以被修改呢?

const int i=0;

int *p=(int*)&i;

p=100;

通過強制型別轉換,將位址賦給變數,再作修改即可以改變const常量值。

8. 請分清數值常量和指標常量,以下宣告頗為玩味:

int ii=0;

const int i=0;            //i是常量,i的值不會被修改

const int *p1i=&i;        //指標p1i所指內容是常量,可以不初始化

int  * const p2i=ⅈ     //指標p2i是常量,所指內容可修改

const int * const p3i=&i; //指標p3i是常量,所指內容也是常量

p1i=ⅈ                  //合法

*p2i=100;                 //合法

關於c++中的const關鍵字的用法非常靈活,而使用const將大大改善程式的健壯性,參考了康建東兄的const使用詳解一文,對其中進行了一些補充,寫下了本文。

1.       const常量,如const int max = 100;  

優點:const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤(邊際效應)

2.       const 修飾類的資料成員。如:

class a

const資料成員只在某個物件生存期內是常量,而對於整個類而言卻是可變的。因為類可以建立多個物件,不同的物件其const資料成員的值可以不同。所以不能在類宣告中初始化const

C語言const限定詞基本用法

它限定乙個變數不允許被改變,產生靜態作用。使用const在一定程度上可以提高程式的安全性和可靠性。另外,在 別人 的時候,清晰理解const所起的作用,對理解對方的程式也有一定幫助。像這種 hello 字串是唯讀的,操作其記憶體是不允許的。char str hello str 2 x printf ...

const限定詞使用

可以 const關鍵字建立不允許修改的陣列 const int days1 12 1.在指標和形參宣告中使 const 宣告普通變數和陣列時使 const 關鍵字很簡單。指標則複雜 些,因為要區分是限定指標本 為const 還是限定指標指向的值為 const。下 的宣告 const float pf...

c語言中的型別限定詞之一volatile

大多數計算機擁有一系列暫存器,其訪問速度比計算機主存更快。好的編譯程式能進行一種被稱為 冗餘裝入和儲存的刪去 redundant load and store removal 的優化,即編譯程式會在程式中尋找並刪去這樣兩類 一類是可以刪去的從記憶體裝入資料的指令,因為相應的資料已經被存放在暫存器中 ...