c 中const的使用詳解

2022-10-04 05:15:08 字數 3417 閱讀 3792

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,編譯器就會準確的...