C++中CONST用法總結
1、修飾常量時:
1 2 |
|
2、修飾指標時:
主要看const在*的前後,在前則指標指向的內容為常量,在後則指標本身為常量;
1 2 3 4 |
ptr; //*ptr、ptr均為常量;
|
3、const修飾類物件時:
const修飾類物件時,其物件中的任何成員都不能被修改。const修飾的物件,該物件的任何非const成員函式都不能呼叫該物件,因為任何非const成員函式都會有修改成員變數的可能。
1 2 3 4 5 6 7 |
|
4、const修飾成員變數:
const修飾的成員變數不能被修改,同時只能在初始化列表中被初始化,因為常量只能被初始化,不能被賦值;
賦值是使用新值覆蓋舊值建構函式是先為其開闢空間然後為其賦值,不是初始化;而初始化列表開闢空間和初始化是同時完成的,直接給與一個值,所以const成員變數一定要在初始化列表中完成。
1 2 3 4 |
//只能在初始化列表中賦值;
|
5、const修飾類的成員函式
const成員函式表示該成員函式不能修改類物件中的任何非const成員變數。一般const寫在函式的後面,形如:void func() const;
如果某個成員函式不會修改成員變數,那麼最好將其宣告為const,因為const成員函式不會對資料進行修改,如果修改,編譯器將會報錯;
1 2 3 |
|
對於const類物件,只能呼叫類中的const成員函式,所以const修飾成員函式的作用主要就是限制對const物件的使用。
6、const在函式宣告中的使用:
在函式宣告中,const可以修飾函式的返回值,也可以修飾具體某一個形參;
修飾形參時,用相應的變數初始化const常量,在函式體內,按照const所修飾的部分進行常量化;
修飾函式返回值時,一般情況下,const修飾返回值多用於操作符的過載。通常不建議用const修飾函式的返回值型別為某個物件或某個物件引用的情況;
7、const常量與define巨集定義的區別:
1)處理階段不同:
define是在預處理階段,define常量從未被編譯器看見,因為在預處理截斷就已經替換了;
const常量在編譯階段使用。
2)型別和安全檢查不同
define沒有型別,不做任何檢查,僅僅是字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤
const常量有明確的型別,在編譯階段會進行型別檢查;
3)儲存方式不同
define是字元替換,有多少地方使用,就會替換多少次,不會分配記憶體;
編譯器通常不會為const常量分配空間,只是將它們儲存在符號表內,使他們成為一個編譯期間的一個常量,沒有讀取記憶體的操作,效率也很高;
8、mutable關鍵字:
在C++中,mutable是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在一個const函式中,甚至結構體變數或者類物件為const,其mutable成員也可以被修改:
1 2 3 4 5 6 7 8 9 10 |
|
mutable只能修飾非靜態資料成員;
9、const_cast:
用於修改型別的const或volatile屬性。
用法:
1 |
|
該運算子用來修改型別的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的型別是一樣的。
1)常量指標被轉化成非常量的指標,並且仍然指向原來的物件;
2)常量引用被轉換成非常量的引用,並且仍然指向原來的物件;
3)const_cast一般用於修改底指標。如const char *p形式。 建議:
1、應該儘可能使用const,它會允許你指定一個語義約束(也就是指定一個不能被改動的物件),而編譯器會強制實施這項約束。它允許你告訴編譯器和其他程式設計師某值應該保持不變。
2、將某些東西宣告為const可幫助編譯器偵測出錯誤用法。const可被施加於任何作用域內的物件、函式引數、函式返回型別、成員函式本體;
3、編譯器強制實施bitwise constness,但你編寫程式時應該使用“概念上的常量性”(conceptual constness);
4、當const和non_const成員函式有著實質等價的實現時,令non-const版本呼叫const版本可避免程式碼重複;