**
參考 此篇介紹 c++ 中的mutable
關鍵字。
mutable
從字面意思上來說,是「可變的」之意。
c++ 中,不可變的變數,稱之為常量,使用const
來修飾。然而,若是const mutable
聯用,未免讓人摸不著頭腦——到底是可變還是不可變呢?
事實上,mutable
是用來修飾乙個const
示例的部分可變的資料成員的。如果要說得更清晰一點,就是說mutable
的出現,將 c++ 中的const
的概念分成了兩種。
當然,所謂的「邏輯const
」,在 c++ 標準中並沒有這一稱呼。這只是為了方便理解,而創造出來的名詞。
顯而易見,mutable
只能用來修飾類的資料成員;而被mutable
修飾的資料成員,可以在const
成員函式中修改。
這裡舉乙個例子,展現這類情形。
1234567
891011
1213
1415
1617
1819
2021
class hashtablestd::string value;
last_key_ = key;
last_value_ = value;
return value;
}private:
mutable std::string last_key_
mutable std::string last_value_;
};
這裡,我們呈現了乙個雜湊表的部分實現。顯然,對雜湊表的查詢操作,在邏輯上不應該修改雜湊表本身。因此,hashtable::lookup
是乙個const
成員函式。在hashtable::lookup
中,我們使用了last_key_
和last_value_
實現了乙個簡單的「快取」邏輯。當傳入的key
與前次查詢的last_key_
一致時,直接返回last_value_
;否則,則返回實際查詢得到的value
並更新last_key_
和last_value_
。
在這裡,last_key_
和last_value_
是hashtable
的資料成員。按照一般的理解,const
成員函式是不允許修改資料成員的。但是,另一方面,last_key_
和last_value_
從邏輯上說,修改它們的值,外部是無有感知的;因此也就不會破壞邏輯上的const
。為了解決這一矛盾,我們用mutable
來修飾last_key_
和last_value_
,以便在lookup
函式中更新快取的鍵值。
c++11 引入了 lambda 表示式,程式設計師可以憑此建立匿名函式。在 lambda 表示式的設計中,捕獲變數有幾種方式;其中按值捕獲(caputre by value)的方式不允許程式設計師在 lambda 函式的函式體中修改捕獲的變數。而以mutable
修飾 lambda 函式,則可以打破這種限制。
123
int x;auto f1 = [=]() mutable ; // okay, 建立了乙個函式型別的例項
auto f2 = [=]() ; // error, 不允許修改按值捕獲的外部變數的值
需要注意的是,上述f1
的函式體中,雖然我們給x
做了賦值操作,但是這一操作僅只在函式內部生效——即,實際是給拷貝至函式內部的x
進行賦值——而外部的x
的值依舊是0
。
const意思是「這個函式不修改物件內部狀態」。
為了保證這一點,編譯器也會主動替你檢查,確保你沒有修改物件成員變數——否則內部狀態就變了。
mutable意思是「這個成員變數不算物件內部狀態」。
比如,你搞了個變數,用來統計某個物件的訪問次數(比如供debug用)。它變成什麼顯然並不影響物件功用,但編譯器並不知道:它仍然會阻止乙個宣告為const的函式修改這個變數。
把這個計數變數宣告為mutable,編譯器就明白了:這個變數不算物件內部狀態,修改它並不影響const語義,所以就不需要禁止const函式修改它了。
《effective c++》條款03就有講到:對於c++類的const成員函式,logical constness的觀點允許修改它所處理的物件內的某些bits,但是bitwise const的觀點是不能改變物件內的任何乙個bit。
寫乙個const成員函式,你想在函式內部給物件成員重新賦值,但是編譯器堅持乙個bit都不讓改動,這個時候就加mutable解除限制。
*************** end
c 中mutable關鍵字
mutalbe的中文意思是 可變的,易變的 跟constant 既c 中的const 是反義詞。在c 中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在乙個const函式中。我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一...
C 中關鍵字mutable
c 中的關鍵字mutable翻譯出來是 易變的。其可以看做是const的反義詞,作用也是反向於const的。當用const修飾類物件時 常物件 代表著其值是不能修改的。但我們也許會在某些時刻需要一種可以在常物件內可修改的變數。這時我們就需要了關鍵字mutable。型如 mutable 變數型別 變數...
C 中的mutable關鍵字
mutalbe的中文意思是 可變的,易變的 跟constant 既c 中的const 是反義詞。在c 中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在乙個const函式中。我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一...