詳解成員函數的常量性

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

發佈了31 篇原創文章 · 獲贊 15 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章