C++ 頂層 const

我的主力博客:半畝方塘

本文的主要參考來源來自於:C++ Primer 中文版(第 5 版) 第 57 面至第 58 面

1. 頂層 const 與底層 const 概念

我們知道,指針本身是一個對象,因爲,指針實際對應着內存單元的一段存儲空間,然而,指針所指向的也是一個數據對象,因此,指針是一個常量與指針所指向的是一個常量是兩個完全不同的概念, 頂層 const 表示的是 指針本身是一個常量, 底層 const 表示的是 指針所指的對象是一個常量,更一般情況下, 頂層 const 可以表示任意對象是一個常量,這對於算術類型、類、指針等任何數據類型都是成立的, 底層 const 則與指針和引用等複合類型的基本類型部分有關 ,比較特殊的是,指針既可以是頂層 const 也可以是底層 const ,這一點與其他類型區別明顯。

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

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

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

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

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&,賦值語句等號右側的類型向左側轉換,一般非常量可以向非常量轉換,所以是正確的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章