如果我們在定義一個對象之後,不希望在後面對這個對象進行修改,那麼我們可以把這個對象聲明為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,那麼最好将這些需要修改的資料放入另一個獨立的對象裡,并間接地通路它。
歡迎轉載,分享是進步的源泉。