天天看點

【C++】const對象和const成員const對象const成員源代碼下載下傳位址:

如果我們在定義一個對象之後,不希望在後面對這個對象進行修改,那麼我們可以把這個對象聲明為const對象。

聲明為const對象之後,這個對象的所有資料成員後面都不能被修改!

定義類對象時可以将其指定為const對象。定義後const對象不能再被修改。

const對象不能調用非const類型的成員函數。

有兩種方法來定義一個const對象:

const 類名 對象名

類名 const 對象名

這兩種方法是等價的。

如果一個對象被定義成const對象,那麼它就不能調用這個類中的非const成員函數。

const對象調用的成員函數一定都得是const!

如果你用const對象引用了這個類中的非const成員函數,就會報錯:

其實就是告訴我們const對象不能引用非const成員函數

為什麼要有這個規則:

因為在非const成員函數内部可能對對象進行修改,比如set函數

這個規則也就是強制使用者不要對const成員進行錯誤的修改

也就是變量,比如執行個體中的m_hour,m_minute是普通資料成員

在類内部使用const關鍵字來聲明const資料成員。const資料成員的值不能被修改。

初始化時比較特殊,隻能通過初始化清單初始化。不能在構造函數裡指派。

初始化清單:

除了在構造函數中對資料成員進行初始化,C++還提供另外一種方法來對資料成員進行初始化

初始化清單并不是在構造函數内進行初始化

構造函數初始化清單以一個冒号開始,接着是以逗号分隔的資料成員清單,每個資料成員後面跟一個放在括号中的初始化式。

必須初始化,而且不能在構造函數中初始化!

每一個構造函數都需要初始化這個const成員,而且複制構造函數也需要初始化num,因為複制構造函數也是一種構造函數!

const成員函數隻能被const對象引用。const成員函數内可以引用const資料成員,也可以引用非const資料成員,但不能修改非const資料成員的值。但不能調用非const成員函數。

對于const函數的外部定義,也需要寫const限定符

const成員函數存在的意義在于它能被const常對象調用

如果在const成員函數的定義中出現了任何修改對象成員資料的現象,都會在編譯時被檢查出來

如果我們是真的想在const成員函數中修改值呢,比如我需要m_age++;

比如下面定義了一個m_age 類成員:

假如我們不做其他事情,這樣的寫法,在編譯時是無法通過的。

有些時候,我們想要讓const函數具有修改某個成員資料值的能力。

比如一些内部的狀态量,對外部使用者無所謂,但是對整個對象的運作卻大有用處,如支援緩存的技術。

遇到這種問題,我們可以把一個成員資料定義為mutable(多變的),它表示這個成員變量可以被const成員函數修改卻不違法。

比如下面定義了這樣一個m_age 類成員:

這樣,即使像getNum()這樣的const成員函數修改它也是合法的。

但需要注意的時,不要濫用mutabe描述符,如果在某個類中隻有少數一部分是被允許const常量函數修改的,使用mutable是再合适不過的。如果大部分資料都定義為mutable,那麼最好将這些需要修改的資料放入另一個獨立的對象裡,并間接地通路它。

歡迎轉載,分享是進步的源泉。

繼續閱讀