C++基礎(chǔ) 詳細(xì)介紹const的用法
const可以用來定義常量,t定義時(shí),定義了常量的類型,所以更精確一些。
面向?qū)ο笫荂++的重要特性. 但是c++在c的基礎(chǔ)上新增加的幾點(diǎn)優(yōu)化也是很耀眼的。就const直接可以取代c中的#define 。以下幾點(diǎn)很重要,學(xué)不好后果也也很嚴(yán)重 。
const
1. 限定符聲明變量只能被讀
- const int i=5;
- int j=0;
- ...
- i=j; //非法,導(dǎo)致編譯錯(cuò)誤
- j=i; //合法
2. 必須初始化
- const int i=5; //合法
- const int j; //非法,導(dǎo)致編譯錯(cuò)誤
3. 在另一連接文件中引用const常量
- extern const int i; //合法
- extern const int j=10; //非法,常量不可以被再次賦值
4. 便于進(jìn)行類型檢查
用const方法可以使編譯器對處理內(nèi)容有更多了解。
- #define I=10
- const long &i=10; /*dapingguo提醒:由于編譯器的優(yōu)化,使得在const long i=10;
- 時(shí)i不被分配內(nèi)存,而是已10直接代入以后的引用中,以致在以后的代碼中沒有錯(cuò)誤,為達(dá)到說教效果,
- 特別地用&i明確地給出了i的內(nèi)存分配。不過一旦你關(guān)閉所有優(yōu)化措施,即使const long i=10;也會(huì)引起后面的編譯錯(cuò)誤。*/
- char h=I; //沒有錯(cuò)
- char h=i; //編譯警告,可能由于數(shù)的截短帶來錯(cuò)誤賦值。
5. 可以避免不必要的內(nèi)存分配
- #define STRING "abcdefghijklmn\n"
- const char string[]="abcdefghijklm\n";
- ...
- printf(STRING); //為STRING分配了第一次內(nèi)存
- printf(string); //為string一次分配了內(nèi)存,以后不再分配
- ...
- printf(STRING); //為STRING分配了第二次內(nèi)存
- printf(string);
- ...
由于const定義常量從匯編的角度來看,只是給出了對應(yīng)的內(nèi)存地址,而不是象#define一樣給出的是立即數(shù),所以,const定義的常量在程序運(yùn)行過程中只有一份拷貝,而#define定義的常量在內(nèi)存中有若干個(gè)拷貝。
6. 可以通過函數(shù)對常量進(jìn)行初始化
- int value();
- const int i=value();
dapingguo說:假定對ROM編寫程序時(shí),由于目標(biāo)代碼的不可改寫,本語句將會(huì)無效,不過可以變通一下:
- const int &i=value();
只要令i的地址處于ROM之外,即可實(shí)現(xiàn):i通過函數(shù)初始化,而其值有不會(huì)被修改。
7. 是不是const的常量值一定不可以被修改呢?
觀察以下一段代碼:
- const int i=0;
- int *p=(int*)&i;
- p=100;
通過強(qiáng)制類型轉(zhuǎn)換,將地址賦給變量,再作修改即可以改變const常量值。
8. 請分清數(shù)值常量和指針常量,以下聲明頗為玩味:
- int ii=0;
- const int i=0; //i是常量,i的值不會(huì)被修改
- const int *p1i=&i; //指針p1i所指內(nèi)容是常量,可以不初始化
- int * const p2i=ⅈ //指針p2i是常量,所指內(nèi)容可修改
- const int * const p3i=&i; //指針p3i是常量,所指內(nèi)容也是常量
- p1i=ⅈ //合法
- *p2i=100; //合法
以上幾點(diǎn)都是非常重要的,希望對你有幫助。
【編輯推薦】