C 中mutable關鍵字存在的必要性是什麼?

時間 2021-05-31 11:54:25

1樓:千月

const宣告是告訴使用者此操作不會改變物件狀態,類似於一種保證。當一些變數不屬於物件狀態時,我們應該也要允許它在const函式中發生改變。舉個簡單的例子,我想統計某個物件介面被呼叫的次數,使用者應該不想const函式被排除吧,mutable不就派上用場了。

2樓:YiQiuuu

我的理解是,乙個類函式設計時就確定不會也不許之後有人改到裡面成員,所以用const修飾是最安全的,但是這樣沒考慮擴充套件,比如說為了某個功能需要改到某個成員,亦或是在裡面需要改到乙個自己新加的成員,這樣就可以加mutable,你可以改自己想改的,其它不允許改的也還是不能改,不會影響功能語義,這種擴充套件常用於查詢快取,以Opengl為例,有一些查詢函式預設就是const的,你加個雜湊表快取key,在查詢的時候更新雜湊表(這時候你加的雜湊表就需要為mutable),然後就可以從雜湊表裡取東西了,既能加速又不會影響核心功能,你把這個函式的const去掉那就風險很大了

3樓:

如果你用std::set的時候,並且自定義了乙個結構體,並且你用iterator訪問,此時如果不加mutable,所有的成員變數都是無法修改的……

4樓:

有些時候為了寫相容STL的類,就不得不用mutable關鍵字。STL裡面有很多函式引數是const的,函式內部只能呼叫該物件的const函式,這時如果物件內部的某些變數需要改動就需要該關鍵字。

舉個例子,iterator標頭檔案裡面的istreambuf_iterator類的過載解引用(*)運算子函式是const的,內部修改了乙個mutable變數。該函式是const的原因就是為了與輸入迭代器的介面一致。

(這個例子是之前閱讀原始碼時看到的,寫答案時沒有翻原始碼,如果有錯誤請指出。)

5樓:Tux ZZ

1. 鎖

2. 快取

以上兩個都可能在呼叫表面看起來不會改變物件內容的函式時被改變,鎖可能會被加鎖解鎖,快取可能會在第一次呼叫const函式時建立。

6樓:胖財

語言feature畸簡,蓋不住應用場景的典型範例。

重新設計的話,const首先就不應該是型別的一部分,更何況函式型別。

const連immutable都不是,自欺欺人並沒有什麼太大的好處。

乙個更合適的抽象方式是attribute。

7樓:朋克李PunkLi

《effective C++》條款03就有講到:對於C++類的const成員函式,logical constness的觀點允許修改它所處理的物件內的某些bits,但是bitwise const的觀點是不能改變物件內的任何乙個bit。

寫乙個const成員函式,你想在函式內部給物件成員重新賦值,但是編譯器堅持乙個bit都不讓改動,這個時候就加mutable解除限制。

8樓:

舉個例子:你寫了乙個基於mutex的執行緒安全的佇列。

對外介面應該如下:

class

Queue

;但你使用empty這個const member function的時候肯定也要先獲得內部的乙個mutex,也就是說在const函式時也會改變內部狀態,於是就要把mutex_宣告成mutable的。

class

Queue};

9樓:invalid s

一碼歸一碼。

const意思是「這個函式不修改物件內部狀態」。

為了保證這一點,編譯器也會主動替你檢查,確保你沒有修改物件成員變數——否則內部狀態就變了。

mutable意思是「這個成員變數不算物件內部狀態」。

比如,你搞了個變數,用來統計某個物件的訪問次數(比如供debug用)。它變成什麼顯然並不影響物件功用,但編譯器並不知道:它仍然會阻止乙個宣告為const的函式修改這個變數。

把這個計數變數宣告為mutable,編譯器就明白了:這個變數不算物件內部狀態,修改它並不影響const語義,所以就不需要禁止const函式修改它了。

C 中,async關鍵字到底起什麼作用?

小墨 async 就把他當成乙個非同步的標誌就好啦。就當做和void 一樣。await 等待非同步 但也可以使用xx.result 獲取 await之後的結果。 pokemon 高階篇 以IL為劍,直指async await 布魯克石 CSDN部落格 可以看看這個,async await 是語法糖,...

C 和 C 的 volatile 關鍵字為什麼給程式設計者造成了如此大的誤解?

望山 我看題主的誤解也不小。volatile關鍵字提出時候那個年代,記憶體發生CPU無法預知的意外變化的主要原因是這個位址對應的是外設暫存器,但並非只有這一種情況。多CPU或者多核心爭用記憶體,還有另外答主說的ISR裡面改了記憶體,也是屬於volatile需要發揮作用的情況。這個關鍵字就是用來阻止編...

php中 GLOBAL 和關鍵字global為什麼會受到靜態變數的影響

zjsxwc global a 時會新建乙個指向與外部 a同位址的指標 GLOBALS a static a 時會把外部 a 指標指向 static a的內容,拋棄原先的指向 多讀讀php手冊,非常多例子 PHP 變數範圍 PHP 引用的解釋 PHP 引用傳遞 PHP 引用做什麼 變數範圍 變數的範...