C++ const限定符和auto类型说明符
const限定符
# 1.限定常量
有時我們希望定義這樣的變量:它的值不能被改變。為了滿足這一要求,我們使用const對變量的類型加以限定:
const?int?bufSize?=?512;這樣就把bufSize定義成了一個常量,它的值不能再發(fā)生變化。所以這也就意味著const對象必須要初始化。那么初始化操作對于const對象來說意味著什么呢?如果利用一個對象去初始化另外一個對象,則它們是不是const都無關緊要:
int?i?=?42; const?int?ci?=?i;??//正確 int?j?=?ci;??//正確這里要注意的是,雖然使用常量ci去初始化j,但是拷貝一個對象的值并不會改變它,一旦完成拷貝,新的對象就和原來的對象沒有什么關系了。
# 2.const對象僅在文件內(nèi)有效
默認情況下,const對象被限定僅在文件內(nèi)有效。當多個文件中出現(xiàn)了同名的const變量時,其實等同于在不同文件中分別定義了獨立的變量。但是,如果需要將const變量在多個文件中實現(xiàn)共享該怎么辦呢?要做到在一個文件中定義const,而在其它多個文件中聲明并且使用它,解決的辦法就是:對于const變量不管是聲明還是定義都添加extern關鍵字,這樣只需要定義一次就夠了。
//第一個文件file1 extern?const?int?bufSize?=?fcn(); //第二個文件file2 extern?const?int?bufSize;??//與file1里面的是同一個const的引用
對常量的引用不能被用作修改它所綁定的對象:
const?int?ci?=?1024; const?int?&r1?=?ci;??//正確,引用及其對應的對象都是常量 r1?=?42;????//錯誤,r1是對常量的引用 int?&r2?=?ci;????//錯誤,r2是非常量引用,ci是一個常量我們知道,引用的類型必須與其所引用的對象的類型一致,但是有兩個特殊情況:(1)初始化常量引用時允許用任意表達式作為初始值,只要該表達式的結果能轉(zhuǎn)換成引用的類型即可。
double?dval?=?3.14; const?int?&ri?=?dval;ri引用了一個int型的數(shù),但是dval確實一個雙精度浮點數(shù),編譯器會將其變成如下形式:
const?int?temp?=?dval; const?int?&ri?=?temp;(2)對const的引用可能引用一個并非const的對象
int?i?=?42; const?int?&ri?=?i;這種方式是允許的。
# const與指針
頂層const
頂層const表示指針本身是一個常量,不能改變它的指向。
int?i?=?43; int?*?const?p1?=?&i;底層const表示指針所指的對象是一個常量。
int?i?=?43; const?int?*?p1?=?&i; int?const?*?p2?=?&i;# 常量表達式與constexpr
常量表達式指的是值不會改變且在編譯過程中就能得到計算結果的表達式:
const?int?max_file?=?20;????//是常量表達式 const?int?limit?=?max_file?+?1????//limit是常量表達式 int?stuff_size?=?10;??????//stuff_size不是常量表達式 const?int?sz?=?getSize();?????//sz不是常量表達式C++11標準規(guī)定,允許將變量聲明為constexpr類型以便由編譯器來驗證變量的值是否是一個常量表達式。聲明為constexpr的變量一定是一個常量,而且必須用常量表達式初始化:
constexpr?int?mf?=?20;??//??正確 constexpr?int?limit?=?mf?+?1;????//mf+1是常量表達式 constexpr?int?sz?=?size();??????//只有當size()是一個constexpr函數(shù)時才是一條正確的語句需要注意的是,在constexpr聲明中如果定義了一個指針,限定符constexpr僅針對指針有效,與所指的對象無關。
# auto類型說明符
C++11引入auto類型說明符,它可以讓編譯器通過初始值來推斷變量的類型。顯然,auto定義的變量必須有初始值。但是,auto會忽略掉頂層const,:
const?int?ci?=?i,?&cr?=?ci; auto?b?=?ci;?????//b是一個整數(shù) auto?c?=?cr;????//c是一個整數(shù) auto d =?&i;?//d是一個整型指針 auto e =?&ci;??//e是一個指向整型常量的指針(這是底層const)但是,有時會遇到一種情況:我想知道這個表達式結果的類型,但是我又不想真的用這個表達式的結果來初始化變量。這個時候就要用到另外一個類型指示符decltype
decltype(f())?sum?=?x;????//sum的類型就是f()函數(shù)的返回類型編譯器并不會實際調(diào)用函數(shù)f(),而是使用當調(diào)用發(fā)生時f的返回值類型作為sum的類型。decltype的一個坑:對于decltype所用的表達式來說,如果decltype給變量加上括號,則返回的是引用類型:
int?i?=?42; decltype((i))?d;????//錯誤,d是int&,必須初始化推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
嵌入式Linux
微信掃描二維碼,關注我的公眾號?
總結
以上是生活随笔為你收集整理的C++ const限定符和auto类型说明符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海康威视球形摄像头激活,web二次开发
- 下一篇: 回调函数这个是什么鬼?