您好,登錄后才能下訂單哦!
const限定符
const是一種限定符,被const所限定的變量其值不可以被改變。
const的初始化
由于const一旦創建其值就不能夠被改變,所以我們必須對其進行初始化
const int a;//錯誤,const變量必須進行初始化! const int b=10;//正確,編譯時初始化 const int c=get_size();//正確,運行時初始化
相同類型的變量相互初始化時,不論變量是否被const限定我們都可以進行隨意的相互拷貝。因為在拷貝過程中我們只會用到等式右邊變量的右值屬性,無須在意其是否可以改變。
int m = 5; const int n = m; int j = n;
const與指針
頂層const與底層const
對于指針來說,由于其指向另一片內存的特點,有三種不同的const情況,即:
我們一般稱符合第一種情況的為具有底層const屬性。
符合第二種情況的為具有頂層const屬性。
第三種情況兼而有之。
關于帶有const的指針的相互賦值(或者初始化)問題
關于底層與頂層const的一些想法
const的底層與頂層屬性似乎只在指針上存在。但是c++primer中有這樣的代碼和注釋:
const int ci=1,&cr=ci; auto b=ci;//b是一個整數(ci的頂層const特性被忽略掉了) auto c=cr;//c是一個整數(cr是ci的別名,ci本身是一個頂層const)
這段代碼是為了說明auto說明符一般會忽略掉頂層const的特性,在注釋中明確寫著 ci本身是一個頂層const 。
這也與我的看法一致,底層與頂層const實際上并不是指針所特有的,只要是不能改變對象自身的對象都具有頂層const,而不能改變自己所指向的對象的對象都具有底層const。
從這個角度看,引用實際上自帶頂層const。
底層const的隱式轉換
上面提到,只有在等號右邊和等號左邊的類型具有相同的底層const屬性,才可以進行賦值或者初始化。
然而有些時候等號右邊可能并不具有和等號左邊一致的底層const卻依然可以成立,這是因為等號右邊的類型發生了隱式轉換從而具有了和等號左邊類型相同底層const屬性。
例如:
int i=5; int *p=&i; const int *cp=p//int*隱式轉換稱為了const int*
為什么int 轉換成const int 被設定為合法的呢,因為在將int 轉換為const int 的過程中用戶的權限變小了,在這一轉換過程中并不會使程序變得不可靠。
由此我們可以得知非底層const的指針是可以通過隱式轉換轉變成底層const的。
const與引用
可以把引用綁定在const的變量上,稱為const的引用,對常量的引用。
與普通的引用不同的是,對常量的引用不能被用作修改它所綁定的對象
const int ci=5; const int &r=ci; r=6//錯誤不可以通過常引用來修改值 int &r2=ci//錯誤,試圖讓一個非常量引用指向一個常量對象。
const引用的初始化
我們知道對于引用來說初始化時一定要用一個對象初始化,且該對象的類型需要與之匹配。
但是const的引用是個例外,在初始化常量引用時允許用任意表達式作為初始值,只要該表達式的結果能轉換成引用的類型即可,甚至允許為一個常量引用綁定非常量的對象、字面值或者是表達式。
int i=42; const int &r1=i;//允許將const int&綁定到一個普通int對象上 const int &r2=3.14;//正確:r2是一個常量引用 const int &r3=r1*2;//正確:r3是一個常量引用 int &r4 =r1*2;//錯誤,非常量引用不能用表達式初始化
C++primer中給出了可以這么做的原因:
要想理解這種例外情況的原因,最簡單的方法是弄清楚當一個常量引用被綁定到另外一種類型上都時到底發生了什么:
double dval=3.14; const int &ri=dval;
此處ri引用了一個int型的數。對ri的操作應該是整數運算,但dval卻是一個雙精度浮點數而非整數。因此為了確保讓ri綁定一個整數,編譯器把上述代碼變成了如下形式:
const int temp=dval;//由雙精度浮點數生成一個臨時的整型常量 const int &ri=temp;//讓ri綁定這個臨時量
在這種情況下,ri綁定了一個臨時量對象。所謂臨時量對象就是當編譯器需要一個空間來暫存表達式的求值結果時臨時創建的一個未命名的對象。C++程序員們常常把臨時量對象簡稱為臨時量。
const與auto類型說明符
auto類型說明符是C++11中新引入的類型說明符,可以自動推斷類型。
編譯器推斷出來的auto類型有時候和初始值的類型并不完全一樣,編譯器會適當的改變結果類型使其更符合初始化規則。
auto在推斷帶有const的對象時,編譯器一般會忽略掉頂層const,同時底層const則會保留下來。 另外對于引用由于引用沒有真正的實體,所以如果用一個引用來初始化auto類型時,auto實際上為引用所指向的對象的類型,而非引用,如果要說明其為引用類型,需要使用auto&。
const int ci=i,&cr=ci; auto b=ci;//b是一個整數(ci的頂層const特性被忽略掉了) auto c=cr;//c是一個整數(cr是ci的別名,ci本身是一個頂層const) auto d=&i;//d是一個整型指針(整數的地址就是指向整數的指針) auto e=&ci;//e是一個指向整數常量的指針(對常量對象取地址是一種底層const)
如果希望推斷出的auto類型是一個頂層const,需要明確指出:
const auto f=ci;//ci的推演類型為int,f是const int。
總結
以上所述是小編給大家介紹的C/C++中const限定符總結,希望對大家有所幫助,也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。