天天看點

C++中頂層const和底層const

1. 頂層 const 與底層 const 概念

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

2. 頂層 const 與底層 const 在運作拷貝操作時的不同

對于頂層 const 與底層 const ,在運作對象拷貝時有着明顯的不同:

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

[cpp] view plaincopyprint? 

  1. int i = 0;  
  2. const int ci = 42;   // 不能改變 ci 的值,這是一個頂層 const  
  3. i = ci;   // 正确:ci 是一個頂層 const,對此操作無影響  
  4. const int *p2 = &ci;  // 同意改變 p2 的值,這是一個底層 const  
  5. const int *const p3 = p2;  // 靠右的 const 是頂層 const ,靠左的是底層 const  
  6. p2 = p3;   // 正确:p2 和 p3 指向的對象的類型同樣,p3 頂層 const 的部分不影響  

(2)底層 const 的限制不能忽略, 要求拷出和拷入的對象有同樣的底層 const 資格或者能轉換為同樣的資料類型,一般很量可以向常量轉換,反之則不行

[cpp] view plaincopyprint?  

  1. int *p = p3;  // 錯誤:p3 包含底層 const 定義,而 p 沒有  
  2. p2 = p3;   // 正确:p2 和 p3 都是底層 const  
  3. p2 = &i;   // 正确:int* 能轉換成 const int*  
  4. int &r = ci;  // 錯誤:普通的 int& 不能綁定到 int 常量上  
  5. 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*,前者是很量,後者是常量,指派語句等号右側的類型向左側轉換,很量可以向常量轉換,故正确;