c 關鍵字mutable作用

2021-08-20 17:17:30 字數 1435 閱讀 4025

在 c++ 中,mutable 是為了突破 const 的限制而設定的。被 mutable 修飾的變數,將永遠處於可變的狀態,即使在乙個 const 函式中,甚至結構體變數或者類物件為 const,其 mutable 成員也可以被修改。

struct test

;const

struct test test = ;

test.a = 10; # 編譯錯誤

test.b = 20; # 允許訪問

mutable 在類中只能夠修飾非靜態資料成員。mutable 資料成員的使用看上去像是騙術,因為它能夠使 const 函式修改物件的資料成員。然而,明智地使用 mutable 關鍵字可以提高**質量,因為它能夠讓你向使用者隱藏實現細節,而無須使用不確定的東西。我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一般會宣告成 const 的。但是,有些時候,我們需要在 const 的函式裡面修改一些跟類狀態無關的資料成員,那麼這個資料成員就應該被 mutalbe 來修飾。

class test

};

const 承諾的是一旦某個變數被其修飾,那麼只要不使用強制轉換 (const_cast),在任何情況下該變數的值都不會被改變,無論有意還是無意,而被 const 修飾的函式也一樣,一旦某個函式被 const 修飾,那麼它便不能直接或間接改變任何函式體以外的變數的值,即使是呼叫乙個可能造成這種改變的函式都不行。這種承諾在語法上也作出嚴格的保證,任何可能違反這種承諾的行為都會被編譯器檢查出來。

mutable 的承諾是如果某個變數被其修飾,那麼這個變數將永遠處於可變的狀態,即使在乙個 const 函式中。這與 const 形成了乙個對稱的定義,乙個永遠不變,而另外乙個是永遠可變。

看乙個變數或函式是否應該是 const,只需看它是否應該是 constant 或 invariant,而看乙個變數是否應該是 mutable,也只需看它是否是 forever mutative。

這裡出現了令人糾結的 3 個問題:

1、為什麼要保護類的成員變數不被修改?

2、為什麼用 const 保護了成員變數,還要再定義乙個 mutable 關鍵字來突破 const 的封鎖線?

3、到底有沒有必要使用 const 和 mutable 這兩個關鍵字?

保護類的成員變數不在成員函式中被修改,是為了保證模型的邏輯正確,通過用 const 關鍵字來避免在函式中錯誤的修改了類物件的狀態。並且在所有使用該成員函式的地方都可以更準確的**到使用該成員函式的帶來的影響。而 mutable 則是為了能突破 const 的封鎖線,讓類的一些次要的或者是輔助性的成員變數隨時可以被更改。沒有使用 const 和 mutable 關鍵字當然沒有錯,const 和 mutable 關鍵字只是給了建模工具更多的設計約束和設計靈活性,而且程式設計師也可以把更多的邏輯檢查問題交給編譯器和建模工具去做,從而減輕程式設計師的負擔。

參考資料

c 中mutable關鍵字

mutalbe的中文意思是 可變的,易變的 跟constant 既c 中的const 是反義詞。在c 中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在乙個const函式中。我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一...

C 中關鍵字mutable

c 中的關鍵字mutable翻譯出來是 易變的。其可以看做是const的反義詞,作用也是反向於const的。當用const修飾類物件時 常物件 代表著其值是不能修改的。但我們也許會在某些時刻需要一種可以在常物件內可修改的變數。這時我們就需要了關鍵字mutable。型如 mutable 變數型別 變數...

關鍵字mutable小議

關鍵字mutable小議 內容 我們知道在用const修飾的類成員函式,這意味著什麼,從effective c 這本書上我們可以了解到,這裡存在兩個流行的概念 bitwise constness or physical constness 和logical constness.bitwise con...