頂層 const表明指標本身是個常量,底層 const 表明指標所指向的物件時乙個常量。
頂層:
底層:
我覺得這個頂層 const(top-level const)和 底層 const(low-level const)應該是由來於距離指標的位置。
我們來genelize頂層 const → 頂層const可以表示任意的物件是常量, 這個適用於任何資料型別。底層 const 則與指標和引用等復合型別的基本型別部分有關。
int i = 0;
int *const p1 = &i; // 不能改變p1的值,這是乙個頂層const
const int ci = 42; // 不能改變ci的值,這是乙個頂層const
const int *p2 = &ci; //允許改變p2的值,這是乙個底層const
// 原因看上面底層那幅圖,我們可以改變p2的指向,只要它依舊指向乙個 const int
const int *const p3 = p2; //靠右的const是頂層const,靠左的const是底層const
const int &r = ci; //用於宣告引用的const都是底層const
用於宣告引用的const都是底層const,這裡感覺我需要記住。也可以這樣理解,因為引用是物件的別名。但實際上我們的 const int &r 是可以綁在普通 int 上的,我們某種程度上還是可以來改變該引用繫結的值。
看例子:
int i = 42;
const int &r = i;
std::cout << r << std::endl;
i = 43;
std::cout << r << std::endl;
頂層const 和 底層const對於拷貝區別明顯:
i = ci; //正確:ci是頂層const
p2 = p3; //正確: p2和p3型別相同,p3頂層const不受影響
當執行物件的拷貝操作時,拷入和拷出的物件必須具有相同的底層const資格,或者兩個物件的資料型別必須能夠轉換,一般非常量可以轉換成常量,反之不行:
int *p = p3; //錯誤:p3包含底層const的定義,p沒有
p2 = p3; // 正確:p2和p3都是底層const
p2 = &i; // 正確:int* 能轉成 const int*
int &r = ci; // 錯誤:普通的int & 不能繫結到int常量上
const int &r2 = i; //正確: const int & 可以繫結在普通int上
之所以我們弄明白這個頂層和底層是因為它之後還出現地方太多了
注意用constexpr 修飾的指標是常量指標,初始值必須是 nullptr 或者 0, 或者是儲存於某個固定位址中的物件。並且constexpr僅對指標有效,與指標所指的物件無關。
const int *p = nullptr; // p是乙個指向整型常量的指標
constexpr int *q = nullptr; // q是乙個指向整數的常量指標
constexpr 把它定義的物件置為了頂層 const.
auto 會忽略頂層const,保留底層const,decltype會保留頂層const和相關資訊。同時 decltype 如果使用不加括號的表示式,會得到相同型別,加括號得到引用。
轉換成const 細談c 的const
c const關鍵字小結 const 是constant的縮寫,本意是不變的,不易改變的意思。const 在c 中是用來修飾內建型別變數,自定義物件,成員函式,返回值,函式引數。1 c語言的const特點 const int a 10 不要把a看成常量 a的本質 是變數 只是 唯讀變數 c語言的co...
轉換成const 細談c 的const
c const關鍵字小結 const 是constant的縮寫,本意是不變的,不易改變的意思。const 在c 中是用來修飾內建型別變數,自定義物件,成員函式,返回值,函式引數。1 c語言的const特點 const int a 10 不要把a看成常量 a的本質 是變數 只是 唯讀變數 c語言的co...
頂層const 底層const
頂層const top level const 表示指標 或引用等 本身是個常量。底層const low level const 表示指標指的物件是乙個常量。一般當說到頂層或底層const的時候都是指標或者引用型別的,因為普通型別的const只能是底層的。例如 const int i 0 i 表示是...