詳解成員函式的常量性

2021-07-03 18:12:01 字數 1157 閱讀 4587

1.什麼是成員函式的常量性?

關於成員函式的常量性當前有兩個流行的概念(1)bitwise constness(又稱physical constness) (2)logical constness

(1)什麼稱之為bitwise constness ?

bitwise constness 是指 ,成員函式只有在不更改物件的任何成員變數(static 除外,因為類的static 變數屬於類 而不屬於物件)時才可以說成員函式具有常量性。也就是說成員函式不更改物件內的任何乙個bit。對於 bitwise constness 來說,編譯器很容易可以看出成員函式是否具有常量性:編譯器只要尋找 成員函式內 是否對成員變數有賦值行為即可。如果在成員函式內對 成員變數進行賦值操作,那麼這個成員函式就不具有常量性,並且bitwise constness 正是c++對常量性的定義。所有const 成員函式不可以更改物件內任何 non-static成員變數。

(2)什麼稱之為logical constness?

但是在實際程式設計過程中,我們發現很多成員函式雖然不具備常量性,但可以通過 bitwise constness 常量性的測試。例如 乙個更改了「指標所指內容」的成員函式顯然不能算是常成員函式,但如果只有指標本身屬於物件,指標所指的內容並不屬於物件 那麼依照bitwise constness方式 來理解常成員函式的編譯器並不會報錯,這顯然不符合常成員函式的定義,因為成員函式 已經修改了成員變數(指標本身並沒有發生改變,但是指標所指的內容已經發生改變)這和我們理解的常成員函式並不相符。這種情況導致了 常成員函式的邏輯常量性(logical constness)。

常成員函式的邏輯常量性(logical constness): 是指乙個常成員函式可以修改它所處理物件內的某些位(bits),但是只有在程式的使用者檢測不出來的情況下才行,因為目前c++編譯器 檢測成員函式的常量性都是按照 bitwise constness來檢測,當常成員函式對成員變數進行修改時,顯然不能通過編譯器編譯。為了支援常成員函式的邏輯常量性,c++引入了mutable 關鍵字來對去掉成員變數的常量性。所以想在常成員函式中對成員變數進行修改 我們必須在想要修改的成員變數之前有關鍵字 mutable 來進行修飾。

參考: effective c++ third edition

常量成員函式

參考 常量成員函式宣告 如 int get const 規則 1.常量成員函式不修改物件。2.常量成員函式在定義和宣告中都應加const限定 3.非常量成員函式不能被常量成員函式呼叫,但建構函式和析構函式除外。4.常量 const物件 物件只能呼叫常量成員函式。const物件的資料成員在物件壽命週期...

常量成員函式

class a void fun1 const error assignment of member a a in read only objectclass a void fun1 const error passing const a as this argument of void a fun...

常量物件與常量成員函式

常量物件與常量成員函式來防止修改物件,實現最低許可權原則。可以用關鍵字const來指定物件是不可修改的,任何修改該物件的企圖,都會導致編譯錯誤。例如 const time noon 12,0,0 宣告乙個 time 類的常量物件 noon 並將它初始化為中午 12點。c 不允許在常量物件上呼叫成員函...