常量指標 和 指標常量
兩種叫法: 常量指標 和 指標常量
關於兩種網上說法不一,書上說法也不一致,所以,我的建議是一般別用這兩個詞,但是在具體的語義下需要能看懂就行。
我們換一個說法來說明這兩個問題:
頂層const 和 底層const
請問,this指標一般情況下是 頂層const 還是 底層 const?
我相信,這難不倒大家,this指標預設指向一個物件,指向的物件地址不可變,所以是頂層const。
第二個問題,類的常成員函式的this指標是 頂層const 還是 底層const?
答案: 類的常成員函式的this指標 既是頂層const,又是底層const。為什麼?下面來說說原因
說到常成員函式?先來說說,普通的成員函式的this指標。
當物件呼叫普通成員函式時,會隱式傳遞物件的地址初始化this指標,此時this指標是個頂層const。
當物件呼叫常成員函式時,實質是:修改this指標的型別。此時,物件不可修改相應的資料成員,相當於給this指標加了底層const屬性。此時,this指標既是頂層const,又是底層const。
多說幾句:
int a = 1;
int *const pa = &a; // 正確, pa 是頂層const,因為指標本身為const
const int *const pb = &a; // 正確,pb既是頂層const,又是底層const。 因為pb本身為const,所指向物件也是const
*pb = 2; // 錯誤,pb為底層const,不可修改所指向物件內容
a = 2; // 正確,a為非const,可修改變數值
所以,我們用頂層const 和 底層const來說明問題,一目瞭然。
補充:
1. 非const物件可以呼叫非const成員函式,也能呼叫const成員函式,
const物件只能呼叫const成員函式,不能呼叫非const成員函式。
2. 建構函式不能定義為const
因為const 成員真正的const屬性實在建構函式之後獲取的,在建構函式中可以對const資料成員初始化、賦值。
3. 類的靜態成員沒有this指標,當然也不能為const
類的靜態成員可以使用成員訪問運算子(. 或 ->) 或者 作用域運算子(::)來訪問。