C++中頂層const和底層const

1. 頂層 const 與底層 const 概念

 指針自己是一個對象,因爲,指針實際相應着內存單元的一段存儲空間,然而,指針所指向的也是一個數據對象,所以,指針是一個常量與指針所指向的是一個常量是兩個全然不一樣的概念, 頂層 const 表示的是 指針自己是一個常量, 底層 const 表示的是 指針所指的對象是一個常量,更普通狀況下, 頂層 const 可以表示隨意對象是一個常量,這對於算術類型、類、指針等不論什麼數據類型都是成立的, 底層 const 則與指針和引用等複合類型的基本類型部分有關 ,比較特殊的是,指針既可以是頂層 const 也可以是底層 const ,這一點與其它類型差異明顯。spa

2. 頂層 const 與底層 const 在運行拷貝操做時的不一樣

對於頂層 const 與底層 const ,在運行對象拷貝時有着明顯的不一樣:.net

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

  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 資格或者能轉換爲一樣的數據類型,通常很量能夠向常量轉換,反之則不行

  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 上  

來分析一下以上的代碼:code

int *p = p3;
p3 既是一個頂層 const 又是一個底層 const,在運行對象拷貝時,頂層 const 部分沒有不論什麼影響,全然不用考慮,但是 p3 又是一個底層 const ,它要求拷入的對象有一樣的底層 const 資格,而 p 沒有,因此是錯的;對象

p2 = p3;
p3 要求拷入的對象擁有一樣的底層 const 資格,p2 也是一個底層 const,故正確;blog

p2 = &i;
對 i 取地址將獲得 int*, p2 是 const int*,前者是很量,後者是常量,賦值語句等號右側的類型向左側轉換,很量能夠向常量轉換,故正確;seo

int &r = ci;
由左側部分咱們知道,需要獲得的是一個綁定到 ci 上的引用,而綁定到 ci 上的引用的類型是 const int&,等號左側的類型是 int&,賦值語句等號右側的類型向左側轉換,但是常量不能向很量轉換,因此是錯誤的;ip

const int &r2 = i;
由左側部分咱們知道,需要獲得的是一個綁定到 i 上的引用,而綁定到 i 上的引用的類型是 int&,等號左側的類型是 const int&,賦值語句等號右側的類型向左側轉換,通常很量可以向很量轉換,因此是正確的。內存

不只要注意類型轉換的限制 同一時候需要考慮const的性質
ci

相關文章
相關標籤/搜索