C 之const關鍵字

2021-10-07 03:39:11 字數 3900 閱讀 8640

函式與const

類與const

使用const關鍵字修飾的常量是唯讀的,在程式執行時不能更改。const關鍵字可以用在型別名前,也可以用在型別說明符後。

//----------常量----------

const

double rate=

0.069

;//const在型別名之前

const

int amount=10;

string const name=

"linda"

;//const在型別名之後

//----------陣列----------

const

int array1[2]

[3]=

;const

double array2[3]

=;

要注意,在定義乙個命名常量時,必須用乙個值來進行初始化。它不能先定義,然後再通過賦值語句來進行賦值。

const

double rate;

//非法

rate=

2.5;

//非法

1、頂層const(top-level const)

指標常量,指標本身是常量。宣告時必須初始化,一旦宣告完成指標本身的值(指標儲存的位址值)就不能再改變,即指標不能再指向除此位址之外的其他任何東西。

格式:const在指標符號*後面,即:*const 。

int c=8;

int*

const pc=

&c;//頂層指標,指標本身是乙個常量,不可改變。

2、底層const(low-level const)

==指向常量的指標,指標指向的物件是乙個常量。==指標指向的資料不能改變,但指標本身可以改變。

格式:const放在型別名前後都可以。

int

const a=10;

//常量a

const

int b=5;

//常量b

const

int* pa=

&a;//底層const,指標pa指向的內容是常量,不可改變。

intconst

*pb=

&b;//底層const,const和資料型別可以互換位置。

3、區分

這個地方比較容易搞混,這篇文章的解釋非常形象細緻。

int a =1;

int b =2;

const

int* p1 =

&a;int

*const p2 =

&a;

p1依次解讀為:p1是個指標(*),指向乙個int型物件(int),該物件是個常量(const)。 因此這是乙個底層cosnt。

p2依次解讀為:p2是個常量(const),p2是個指標(*),指向乙個int物件(int)。 因此這是乙個頂層const。

使用cons也可以修飾引用,被修飾的引用為常引用,不能通過該引用變數來修改所引用的物件。

格式:

int d=6;

const

int&pd=d;

//const關鍵字和資料型別名的順序可以交換

intconst

&pe=d;

pd=7

;//非法

const修飾函式引數的情況

1、引用傳遞:函式的形參為引用變數。由於引用變數是另乙個變數的別名,對引用變數做出的任何更改實際上都是對它所引用的變數記憶體位置中儲存資料的更改。當函式因為某種原因需要使用引用變數作為形參來減小拷貝開銷時,如果對引用引數加上const修飾符,就可以防止修改物件的值,達到了保護物件和減小開銷的兩個目的。

double

num(

const

int&x)

2、指標傳遞:給指標引數加上頂層const可以防止指標指向被篡改,加上const關鍵字可以防止指向物件被篡改。

void

fun(

const

char

* s1,

char

* s2)

當實參按值傳遞給形參時,只會傳遞實參值的副本,函式體內對形參的改變不會影響到實參。因此按值傳參的時候不需要const關鍵字的修飾。

要注意:雖然常量的位址只能傳遞給指向const的指標,但是,指向const的指標也可以接收非常量專案的位址

1、返回指標

給返回值為指標的函式的返回值加 const 修飾,那麼函式返回的指標就不能被修改,且返回值只能被賦給同樣有const 修飾的同型別指標。

//------不使用const關鍵字修飾------

string*

getname()

intmain()

//------使用const關鍵字修飾------

const string*

getname()

intmain()

2、返回引用

給返回值為引用的函式的返回值加 const 修飾,使得函式呼叫表示式不能作為左值。

//------不使用const關鍵字修飾------

//------使用const關鍵字修飾------

class

test

const

int&

geta()

void

show()

};intmain()

報錯,無法修改:

格式與const修飾一般常量時相同。

在類內部使用const關鍵字來宣告const資料成員,那麼const資料成員的值不能被修改。初始化時只能通過建構函式初始化列表初始化。不能在建構函式裡面初始化。

class

square

void

show()

};

指定常量成員函式,告訴編譯器該函式不應更改物件中的任何資料字段的值。

格式:將 const 關鍵字放在函式頭的末尾。

int

getarea()

const

注:

1、非const物件可以呼叫const成員函式或者非const成員函式。

2、const物件只能呼叫const成員函式,若直接呼叫非const成員函式編譯器會報錯。

3、構造與析構函式不能定義為const成員函式,因為建構函式和析構函式會對物件做修改

class

square

intgetarea()

const

intgetperimeter()

};intmain()

C 關鍵字之const

我只要一聽到被面試者說 const意味著常數 不是常數,可以是變數,只是你不能修改它 我就知道我正在和乙個業餘者打交道。去年dan saks已經在他的文章裡完全概括了const的所有用法,因此esp 譯者 embedded systems programming 的每一位讀者應該非常熟悉const能...

C語言關鍵字之const

const關鍵字是嵌入式程式設計師必須熟悉的。因為它的使用可以增加程式的健壯性,並且使讀者更好地理解程式。它所修飾的變數被叫做 唯讀變數 注意 唯讀變數 常量 千萬不要說被const所修飾的變數就是常量!那只能說明你對const還不太理解!下面就讓我們來分析一下const。首先看以下定義 const...

C 之const關鍵字用法

c const 允許指定乙個語義約束,編譯器會強制實施這個約束,允許程式設計師告訴編譯器某值是保持不變的。只有乙個const,如果const位於 左側,表示指標所指資料是常量,不能通過解引用修改該資料 指標本身是變數,但可以指向其他的記憶體單元。等價於 const int p int const p...