C 中mutable 中的用法

2021-06-11 12:38:08 字數 2795 閱讀 8170

關鍵字

mutable

的中文意思是:

「可變的、易變的」與

constant

(即c++

中const

)是反義詞。

c++中的

mutable

是為了突破

const

限制而設定的,被

mutable

修飾的變數將永遠處於可變狀態,即使是位於

const

修飾的函式中。

mutable

又是乙個奇怪的修飾符(

specifier

),它只能夠用於乙個類的非靜態資料成員。下面我將討論

mutable

的語義和用法,但是首先我要解釋一下

c++

物件模型的乙個關鍵概念。

物件的狀態

乙個物件的狀態由其非靜態資料成員的值構成,因此,修改乙個資料成員將會改變整個物件的狀態。將乙個成員函式宣告為

const

能夠保證它不會改變物件的狀態。

然而在一些情況下,物件的邏輯狀態與其物理狀態之間可能有差別。例如,對於乙個表示繪畫影象的物件就存在這種情況。如果影象還沒有更改,那麼我們就認為其狀態沒有發生變化。然而,從底層實現方面來說,如果大物件在一段時間沒有活動,那麼它們的記憶體通常會被交換到乙個檔案中。交換乙個影象並不會真地影響其狀態,但是物件的一些資料成員可能會發生變化,在這裡可能會發生變化的是指標、標誌位等。

在使用者呼叫乙個諸如

redraw()

之類的const

成員函式時,他們並不關心這個函式在內部是如何實現的。從他們的角度來說,這個函式並不改變物件的邏輯狀態,因此被宣告為

const

。redraw()

有可能修改物件的物理狀態這一事實是乙個他們不應該關心的實現細節。例如:

int image::redraw() const

//..paint image in the screen

}可變(

mutable

)資料成員

如果嘗試編譯這段**,你會得到乙個編譯錯誤。雖然

redraw()

宣告為const

,但是它修改了乙個資料成員。解決這個編譯錯誤的方法是將

isloaded

宣告為乙個

mutable

資料成員:

class image ;

不像普通的資料成員,

const

成員函式可以修改

mutable

資料成員。

mutable

資料成員的使用看上去像是騙術,因為它能夠使

const

函式修改物件的資料成員。然而,明智地使用

mutable

關鍵字可以提高**質量,因為它能夠讓你向使用者隱藏實現細節,而無須使用不確定的東西,比如

const_cast<>。

mutalbe

的中文意思是

「可變的,易變的」,跟

constant

(既c++

中的const

)是反義詞。 在

c++中,

mutable

也是為了突破

const

的限制而設定的。被

mutable

修飾的變數,將永遠處於可變的狀態,即使在乙個

const

函式中。

我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一般會宣告成

const

的。但是,有些時候,我們需要在

const

的函式裡面修改一些跟類狀態無關的資料成員,那麼這個資料成員就應該被

mutalbe

來修飾。

下面是乙個小例子:

class clxtest

;void clxtest::output() const

void outputtest(const clxtest& lx)

類clxtest

的成員函式

output

是用來輸出的,不會修改類的狀態,所以被宣告為

const的。

函式outputtest

也是用來輸出的,裡面呼叫了物件lx的

output

輸出方法,為了防止在函式中呼叫其他成員函式修改任何成員變數,所以引數也被

const

修飾。

如果現在,我們要增添乙個功能:計算每個物件的輸出次數。如果用來計數的變數是普通的變數的話,那麼在

const

成員函式

output

裡面是不能修改該變數的值的;而該變數跟物件的狀態無關,所以應該為了修改該變數而去掉

output

的const

屬性。這個時候,就該我們的

mutable

出場了——

只要用mutalbe

來修飾這個變數,所有問題就迎刃而解了。

下面是修改過的**:

class clxtest

;clxtest::clxtest()

clxtest::~clxtest()

{}void clxtest::output() const

int clxtest::getoutputtimes() const

void outputtest(const clxtest& lx)

計數器m_itimes

被mutable

修飾,那麼它就可以突破

const

的限制,在被

const

修飾的函式裡面也能被修改

c 中mutable的用法

multable雖然在日常的工作中很少用到,但是畢竟multable屬於c 語法中的乙個關鍵自所以,在大多數的面試中經常被提到,所以如果你要重新找工作了還是要了解這個關鍵字的 再了解multable之前我們要先認真的回顧一下什麼叫常函式,常函式無非就是帶const修飾的函式罷了,為什麼要有常函式這個...

詳解C 中mutable的用法

編譯執行環境 vs2017 win32 debug mutalbe的程式設計客棧中文意思是 可變的,易變的 是constant 即c 中的const 的反義詞。在c 中,mutable也程式設計客棧是為了突破const的限制而設定的,被mutable修飾的變數將永遠處於可變的狀態。mutable的作...

C 中mutable的使用

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