C++的頂層const與底層const
阿新 • • 發佈:2018-11-06
首先:頂層const表示指標本身是個常量,底層const表示指標所指的物件是一個常量。更一般的,頂層const可以表示任意的物件是常量,這一點對任何資料型別都適用。底層const則與指標和引用等複合型別的基本型別部分有關。
書上的一些例子:
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 const int &r = ci; //用於宣告引用的const都是底層const
如何區分頂層const與底層const
低層 const:
個人的理解:宣告指向常量的指標就是底層const。
int num1 = 1;
int const *p2 = &num1; //底層const
//*p2 = 2; //error C3892: “p2”: 不能給常量賦值
num1 = 2;
std::cout<<*p2<<"\n"<<std::endl; //輸出為2
注意:“常量指標”不一定非要指向常量,只是不能通過解引用符(*)來改變它所指向的內容。
頂層 const
頂層const可以表示任意的物件是常量,這一點對任何資料型別都適用。對於指標:要求本身是常量,宣告時必須初始化,之後它儲存的地址值就不能再改變,可以通過解引用符(*)來改變它所指向的內容。
int num1 = 1, num2 = 2;
int *const p1 = &num1; //頂層const
//p1 = &num2; //error C3892: “p_b”: 不能給常量賦值
*p1 = 2;
std::cout<<*p1<<"\n"<<std::endl; //輸出為2
對於指標,一個指標本身新增const限定符就是頂層const,而指標所指的物件新增const限定符就是底層const。
const int *p2 = &ci; //p2是const int * 型別(指向整型常量的指標),是底層const int *const p1 = &i; //p1是int * 型別常量(指標常量),是頂層const const int *const p3 = p2; //靠右的const是頂層const,靠左的是底層const //p3是const int * 型常量。
頂層const與底層const的作用
物件拷貝時頂層const不受什麼影響,拷貝操作不會改變被拷貝物件的值。
對底層const卻有限制,常量的底層const不能賦值給非常量的底層const。
int i = 0;
const int ci = 42; //頂層const
const int *p2 = &ci; //底層const
const int *const p3 = p2; //既是頂層const,又是底層const
p2 = p3; //都是底層const(p3既是底層const又是頂層const)
p2 = &i; //int *, 可以轉換為 const int *
//int &r = ci; //int& 不能繫結到const int型別 (error C2440: “初始化”: 無法從“const int”轉換為“int &” 轉換丟失限定符)
const int &r2 = i; //const int& 能繫結到int型別