C++中的const限定符的使用和作用
const滿足定義一種變量在被設(shè)置初始值后它的值不能再次被改變。
在默認狀態(tài)下,const對象僅在文件內(nèi)有效。
如果需要在不同文件下共享需要添加關(guān)鍵字extern,這樣只需要定義一次就夠了。
extern const int bufSize;
1、const 的引用
把引用綁定到const上,和其他對象使用一樣,最大的區(qū)別在于對常量的引用不能被用作他所修改的綁定對象:
const int ci=1024; const int &rl=ci;//正確:引用及其對應(yīng)的對象都是常量 rl=42;//錯誤:rl是對常量的引用 int &r2=ci;//錯誤:試圖讓一個非常量引用指向一個常量對象
ci不允許賦值,當然也不可能通過引用去改變ci;
初始化和對const的引用
引用類型必須與其所引用對象的類型一直,但是有兩個例外:
1)一個是初始化常量引用時允許任意表達式作為初始值,只要該表達式的結(jié)果能轉(zhuǎn)化成引用的類型即可。
int i=42; const int &rl=i;//正確:允許將const int&綁定到一個普通int對象上 const int &r2=42;//正確:r2是一個常量引用 const int &r3=rl*2;//正確:r3是一個常量引用 int &r4=rl*2;//錯誤:r4是一個普通非常量引用
對const的引用可能引用一個并非const對象
int i=42; int &rl=i;//引用r1綁定到一個i對象上 const int &r2=i;//r2也綁定對象i,但不允許通過r2修改i值 r1=0;//r1并非常量,i的值修改為0 r2=0;//錯誤:r2是一個常量引用
2、指針和const
- 與引用一樣,也可以令指針指向常量或非常量。
- 類似與常量引用,指向常量的指針不能用于改變其所指對象的值。
- 和常量引用一樣,指向常量的指針也沒有規(guī)定其所指的對象必須是一個常量。
所以,要想存放常量對象的地址,只能使用指向常量的指針:
const double pi=3.14;// pi是個常量,它的值不能改變 double *ptr=π//錯誤:ptr是一個普通指針 const double *cptr=π//正確:cptr可以指向一個雙精度常量 *cptr=42;//錯誤:不能給*cptr 賦值
指針的類型必須與其所指對象類型一致,但是有兩個例外:
1、允許令一個指向常量的指針指向一個非常量對象;
double dval=3.14; cptr=&dval;//正確:但是不能通過cptr改變dval的值
const 指針
常量指針必須初始化,而且一旦初始化完成,則它的值(也就是存放在指針中的那個地址)就不能在改變了。
指針是一個常量時,可以通過指針修改其所指對象的值,這樣做完全依賴于所指對象類型。
*pip=2.72;//錯誤:pip是一個指向常量的指針 if(*curErr)//如果curErr所指的對象的值不為0 { errorHandler(); *curErr=0; //正確:把curErr所指的對象的值重置 }
3、頂層const
- 頂層 const (top-level const) 表示指針本身是個常量;
- 底層 const (low-level const) 表示指針所指的對象是一個常量;
4、constexpr和常量表達式
- 常量表達式:是指值不會改變并且在編譯過程就能得到計算結(jié)果的表達式。顯然,字面值是常量表達式,用常量表達式初始化的const對象也是常量表達式。
- constexpr 變量 :在C++11 新標準規(guī)定,允許將變量聲明為 constexpr 類型以便編譯器來驗證變量的值是否是一個常量表達式。
- 字面值類型:指簡單易見的數(shù)據(jù)類型,比如:算術(shù)類型、引用和指針等。
- 指針和 constexpr :必須申明,在constexpr聲明中定義了一個指針,限定符constexpr僅對指針有效,對指針所指的對象無關(guān):
const int *p=nullptr;//p是一個指向整型常量的指針 constexpr int *q=nullptr;//q是一個指向整數(shù)的常量指針
與其他常量指針類似,constexpr 指針既可以指向常量也可以指向一個非常量。
到此這篇關(guān)于C++中的const限定符的使用和作用的文章就介紹到這了,更多相關(guān)C++ const限定符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于C++對象繼承中的內(nèi)存布局示例詳解
這篇文章主要給大家介紹了關(guān)于C++對象繼承中內(nèi)存布局的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。2017-08-08C語言編程數(shù)據(jù)結(jié)構(gòu)線性表之順序表和鏈表原理分析
本篇文章是C語言編程篇主要為大家介紹了C語言編程中的數(shù)據(jù)結(jié)構(gòu)線性表,文中附含豐富的圖文示例代碼為大家詳解了線性表中的順序表和鏈表,有需要的朋友可以借鑒參考下2021-09-09