const 是c++中常用的型別修飾符,常型別是指使用型別修飾符const說明的型別,常型別的變數或物件的值是不能被更新的。
1、定義常量
(1)const修飾變數,以下兩種定義形式在本質上是一樣的。它的含義是:const修飾的型別為type的變數value是不可變的。
type const valuename = value;
const type valuename = value;
(2)將const改為外部連線,作用於擴大至全域性,編譯時會分配記憶體,並且可以不進行初始化,僅僅作為宣告,編譯器認為在程式其他地方進行了定義.
extend const int valuename = value;
2、指標使用const
(1)指標本身是常量不可變
(char*) const pcontent;
const (char*) pcontent;
(2)指標所指向的內容是常量不可變
const (char) *pcontent;
(char) const *pcontent;
(3)兩者都不可變
const char* const pcontent;
(4)還有其中區別方法,沿著*號劃一條線:
如果const位於*的左側,則const就是用來修飾指標所指向的變數,即指標指向為常ugibii量;
如果const位於*的右側,const就是修飾指標本身,即指標本身是常量。
3、函式中使用const
(1)const修飾函式引數
a.傳遞過來ugibii的引數在函式內不可以改變(無意義,因為var本身就是形參)
void function(const int var);
b.引數指標所指內容為常量不可變
void function(const char* var);
c.引數指標本身為常量不可變(也無意義,因為char* var也是形參)
void function(char* const var);
d.引數為引用,為了增加效率同時防止修改。修飾引用引數時:
void function(const class& var); //引用引數在函式內不可以改變
void function(const type& var); //引用引數在函式內為常量不可變
2)const 修飾函式返回值
const修飾函式返回值其實用的並不是很多,它的含義和const修飾普通變數以及指標的含義基本相同。
a.const int fun1() //這個其實無意義,因為引數返回本身就是賦值。
b. const int * fun2() //呼叫時 const int *pvalue = fun2();
//我們可以把fun2()看作成乙個變數,即指標內容不可變。
c.int* const fun3() //呼叫時 int * const pvalue = fun2();
//我們可以把fun2()看作成乙個變數,即指標本身不可變。
4、類相關const
(1)const修飾成員變數
const修飾類的成員函式,表示成員常量,不能被修改,同時它只能在初始化列表中賦值。
class a
; //只能在初始化列表中賦值
} (2)const修飾成員函式
const修飾類的成員函式,則該成員函式不能修改類中任何非const成員函式。一般寫在函式的最後來修飾。
class a
(3)const修飾類物件/物件指標/物件引用
•const修飾類物件表示該物件為常量物件,其中的任何成員都不能被修改。對於物件指標和物件引用也是一樣。
•const修飾的物件,該物件的任何非const成員函式都不能被呼叫,因為任何非const成員函式會有修改成員變數的企圖。
例如:複製** **如下:
class aaa
const aaa aobj;
aobj.func1(); //
aobj.func2(); //正確
const aaa* aobj = new aaa();
aobj-> func1(); //
aobj-> func2(); //正確
5、將const型別轉化為非cugibiionst型別的方法
c++提供了四個轉換運算子:
•const case (expression)
•static_cast (expression)
•reinterpret_cast (expression)
•dynamic_cast (expression)
採用const_cast 進行非const型別轉換。
用法:const_cast (expression)
該運算子用來修改型別的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的型別是一樣的。
•常量指標被轉化成非常量指標,並且仍然指向原來的物件;
•常量引用被轉換成非常量引用,並且仍然指向原來的物件;
•常量物件被轉換成非常量物件。
複製** **如下:
const int constant = 21;
const int* const_p = &constant;
int* modifier = const_cast(const_p);
*modifier = 7;
當然我們可以用下面的傳統方式代替:
複製** **如下:
const int constant = 21;
int* modifier = (int*)(&constant);
從前面**中已經看到,我們不能對constant進行修改,但是我們可以對modifier進行重新賦值。
但是但是,程式世界真的混亂了嗎?我們真的通過modifier修改了constatn的值了嗎?修改const變數的資料真的是c++去const的目的嗎?
如果我們把結果列印出來:
複製** **如下:
cout << "constant: "<< constant constant: 21
const_p: 7
modifier: 7
**/
constant還是保留了它原來的值。
可是它們的確指向了同乙個位址呀:
複製** **如下:
cout << "constant: "<< &constant /**
constant: 0x7fff5fbff72c程式設計客棧
const_p: 0x7fff5fbff72c
modifier: 0x7fff5fbff72c
**/
雖然這樣可以重新賦值const的值,但是絕對不要對const資料進行重新賦值。
本文標題: c++中const的使用詳解
本文位址:
C 中 const使用詳解
const使用詳解 關於c 中的const關鍵字的用法非常靈活,而使用const將大大改善程式的健壯性,現將本人的一些體會總結如下,期望對大家有所幫助 一 const基礎 如果const關鍵字不涉及到指標,我們很好理解,下面是涉及到指標的情況 int b 500 const int a b 1 in...
C 中的 const 詳解
在使用 define時,比如 define max 10000,如果出現錯誤,編譯器並不會提示max,因為在預處理階段已經把max替換成了10000,因此編譯器會莫名其妙的提示10000這個數字出現了錯誤,從而不利於程式debug,但是如果使用const int max 10000,編譯器就會準確的...
C 中的 const 詳解
在使用 define時,比如 define max 10000,如果出現錯誤,編譯器並不會提示max,因為在預處理階段已經把max替換成了10000,因此編譯器會莫名其妙的提示10000這個數字出現了錯誤,從而不利於程式debug,但是如果使用const int max 10000,編譯器就會準確的...