天天看點

mutable的用法



在C++中,mutable也是為了突破const的限制而設定的。被mutable修飾的變量,将永遠處于可變的狀态,即使在一個const函數中。

  我們知道,如果類的成員函數不會改變對象的狀态,那麼這個成員函數一般會聲明成const的。但是,有些時候,我們需要在const的函數裡面修改一些跟類狀态無關的資料成員,那麼這個資料成員就應該被mutalbe來修飾。

關鍵字mutable是C++中一個不常用的關鍵字,他隻能用于類的非靜态和非常量資料成員,我們知道一個對象的狀态由該對象的非靜态資料成員決定,是以随着資料成員的改變,對像的狀态也會随之發生變化! 如果一個類的成員函數被聲明為const類型,表示該函數不會改變對象的狀态,也就是

該函數不會修改類的非靜态資料成員.但是有些時候需要在該類函數中對類的資料成員進行指派.這個時候就需要用到mutable關鍵字了,mutable關鍵字提示編譯器該變量可以被類的const函數修改。

在使用者調用一個諸如 Redraw() 之類的 const 成員函數時,他們并不關心這個函數在内部是如何實作的。從他們的角度來說,這個函數并不改變對象的邏輯狀态,是以被聲明為 const。Redraw() 有可能修改對象的實體狀态這一事實是一個他們不應該關心的實作細節。例如:

可變(mutable)資料成員

    如果嘗試編譯這段代碼,你會得到一個編譯錯誤。雖然 Redraw() 聲明為 const,但是它修改了一個資料成員。解決這個編譯錯誤的方法是将 isLoaded 聲明為一個 mutable 資料成員:

        class Image {

        public:

           int Redraw() const;

           //..

        private:

           mutable bool isLoaded;//can be changed by a const function

        };

不像普通的資料成員,const 成員函數可以修改 mutable 資料成員。