C 中頂層const和底層const

2021-09-08 03:45:49 字數 1963 閱讀 1033

指標本身是乙個物件,由於,指標實際相應著記憶體單元的一段儲存空間,然而,指標所指向的也是乙個資料物件,因此,指標是乙個常量與指標所指向的是乙個常量是兩個全然不同的概念, 頂層 const 表示的是 指標本身是乙個常量, 底層 const 表示的是 指標所指的物件是乙個常量,更普通情況下, 頂層 const 能夠表示隨意物件是乙個常量,這對於算術型別、類、指標等不論什麼資料型別都是成立的, 底層 const 則與指標和引用等復合型別的基本型別部分有關 ,比較特殊的是,指標既能夠是頂層 const 也能夠是底層 const ,這一點與其它型別差別明顯。

對於頂層 const 與底層 const ,在執行物件拷貝時有著明顯的不同:

(1)頂層 const 不受什麼影響

[cpp]view plain

copy

print

?int i = 0;  

const

int ci = 42;   // 不能改變 ci 的值,這是乙個頂層 const

i = ci;   // 正確:ci 是乙個頂層 const,對此操作無影響

const

int *p2 = &ci;  // 同意改變 p2 的值,這是乙個底層 const

const

int *const p3 = p2;  // 靠右的 const 是頂層 const ,靠左的是底層 const

p2 = p3;   // 正確:p2 和 p3 指向的物件的型別同樣,p3 頂層 const 的部分不影響

(2)底層 const 的限制不能忽略, 

要求拷出和拷入的物件有同樣的底層 const 資格或者能轉換為同樣的資料型別,一般很量可以向常量轉換,反之則不行

[cpp]view plain

copy

print

?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 上

來分析一下以上的**:

int *p = p3;

p3 既是乙個頂層 const 又是乙個底層 const,在執行物件拷貝時,頂層 const 部分沒有不論什麼影響,全然不用考慮,可是 p3 又是乙個底層 const ,它要求拷入的物件有同樣的底層 const 資格,而 p 沒有,所以是錯的;

p2 = p3;

p3 要求拷入的物件擁有同樣的底層 const 資格,p2 也是乙個底層 const,故正確;

p2 = &i;

對 i 取位址將得到int*, p2 是const int*,前者是很量,後者是常量,賦值語句等號右側的型別向左側轉換,很量可以向常量轉換,故正確;

int &r = ci;

由左側部分我們知道,須要得到的是乙個繫結到 ci 上的引用,而繫結到 ci 上的引用的型別是const int&,等號左側的型別是int&,賦值語句等號右側的型別向左側轉換,可是常量不能向很量轉換,所以是錯誤的;

const int &r2 = i;

由左側部分我們知道,須要得到的是乙個繫結到 i 上的引用,而繫結到 i 上的引用的型別是int&,等號左側的型別是const int&,賦值語句等號右側的型別向左側轉換,一般很量能夠向很量轉換,所以是正確的。

不僅要注意型別轉換的限制 同一時候須要考慮const的性質

C 中頂層const和底層const

頂層const表示指標本身是個常量,底層const表示指標所指的物件是乙個常量。int i 0 int const p1 i 不能改變p的值,p是乙個指標,所以p是乙個頂層const const int p2 i 表示不能改變指標所指i的值,所以是乙個底層const const的頂層和底層不只是限定...

C 頂層const和底層const

當我們定義指標和變數的時候,有時候希望定義成const型,就是不希望程式中改變自己定義的變數,一旦有 試圖改變定義好的const型的變數,在編譯的時候就會直接報錯。指標本身也是乙個變數物件,指標所指的變數也是乙個變數物件。當定義const int p i的時候是指標不可變還是變數i不可變呢?這就涉及...

C 頂層const和底層const

頂層const表示物件本身是乙個常量 底層const表示不能通過指標或引用改變所指向的物件 例如const int a 42 頂層const,不能改變a的值,int只能有頂層const 指標 int b 12 const int b1 b 底層const,不能通過b1改變a的值,可以理解為b1指向c...