1. 頂層 const 與底層 const 概念
指針本身是一個對象,由于,指針實際相應着記憶體單元的一段存儲空間,然而,指針所指向的也是一個資料對象,是以,指針是一個常量與指針所指向的是一個常量是兩個全然不同的概念, 頂層 const 表示的是 指針本身是一個常量, 底層 const 表示的是 指針所指的對象是一個常量,更普通情況下, 頂層 const 能夠表示随意對象是一個常量,這對于算術類型、類、指針等不論什麼資料類型都是成立的, 底層 const 則與指針和引用等複合類型的基本類型部分有關 ,比較特殊的是,指針既能夠是頂層 const 也能夠是底層 const ,這一點與其它類型差别明顯。
2. 頂層 const 與底層 const 在運作拷貝操作時的不同
對于頂層 const 與底層 const ,在運作對象拷貝時有着明顯的不同:
(1)頂層 const 不受什麼影響
[cpp] view plaincopyprint?
- 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 plaincopyprint?
- 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*,前者是很量,後者是常量,指派語句等号右側的類型向左側轉換,很量可以向常量轉換,故正确;