1. 程式人生 > >常量指標 和 指標常量

常量指標 和 指標常量

兩種叫法:  常量指標  和 指標常量

關於兩種網上說法不一,書上說法也不一致,所以,我的建議是一般別用這兩個詞,但是在具體的語義下需要能看懂就行。

我們換一個說法來說明這兩個問題:

頂層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

    類的靜態成員可以使用成員訪問運算子(. 或 ->) 或者 作用域運算子(::)來訪問。