C++primer1-7章知識點總結——頂層const與底層const

TinnCHEN發表於2019-02-16

頂層const表示任意物件/資料型別本身為常量

底層const與指標和引用等複合型別的基本型別有關

注:
(1)用於宣告引用的const都是底層const
(2)指標型別既可以是頂層const也可以是底層const

eg:

int i = 0;
int *const p1 = &i; //p1為頂層const,其值不能改變
const int ci = 42;  //ci為頂層const,其值不能改變
const int *p2 = &ci; //允許改變p2的值,這是一個底層const
const int *const p3 = p2; //靠右的為頂層const,靠左的為底層const
const int &r = ci; //用於宣告引用的都為底層const

注:底層const的限制:
當執行拷貝操作時,拷入和拷出的物件必須具有相同的底層const資格,或者,兩個物件的資料型別必須能夠轉換。一般來說非常量可以轉換為常量,反之則不行。

具體操作例項:
eg:

i = ci; //正確,ci頂層const不受影響
p2 = p3;//正確,p2和p3指向的物件都相同,且p3又是一個頂層const其本身也為常量
int *p = p3; //錯誤,p3包含底層const定義但是p沒有
p2 = &i;//正確,int i 可以轉換為常量
int &ri = ci;//錯誤,普通的int &不能繫結到int常量上
const int &r2 = i;//正確,const int& 可以繫結到一個普通的int上

補充:

vector<int>::iterator /*可以理解為*/ int* //代表非常量
vector<int>::const_iterator /*可以理解為*/ const int* //代表底層const
const vector<int>::iterator /*可以理解為*/ int* const //代表頂層const
const vector<int>::iterator /*可以理解為*/ const int* const //左側的const為底層const,右側的頂層const

相關文章