C 中的 mutable 關鍵字

2022-06-19 20:33:13 字數 2693 閱讀 5480

** 

參考 此篇介紹 c++ 中的mutable關鍵字。

mutable從字面意思上來說,是「可變的」之意。

c++ 中,不可變的變數,稱之為常量,使用const來修飾。然而,若是const mutable聯用,未免讓人摸不著頭腦——到底是可變還是不可變呢?

事實上,mutable是用來修飾乙個const示例的部分可變的資料成員的。如果要說得更清晰一點,就是說mutable的出現,將 c++ 中的const的概念分成了兩種。

當然,所謂的「邏輯const」,在 c++ 標準中並沒有這一稱呼。這只是為了方便理解,而創造出來的名詞。

顯而易見,mutable只能用來修飾類的資料成員;而被mutable修飾的資料成員,可以在const成員函式中修改。

這裡舉乙個例子,展現這類情形。

123

4567

891011

1213

1415

1617

1819

2021

class hashtable 

std::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函式中。我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一...