c 中對const關鍵字的理解

2021-06-21 03:53:30 字數 2569 閱讀 8153

一、使用const定義普通常量

此時const可以悠然int, float, double等基本資料型別和string,vector。 此時定義的常量的值在程式中是不能改變的。

如: const int ia= 5;

const double pi=3.14;

const string str="abc";

const vectorvs;

對於這種型別的常量而言, const放在型別名的後面也是可以的,即 int const ia=5;

但是一般建議使用第一種形式,因為使用第二種形式當定義指標進,會經常有些讓人混淆。

如: const int *p; 與 int const *p ;的定義是一樣的,但是 int * const p則會是另外一種不同解釋。 這個內容在下面進行介紹,在這裡我們記住使用第一種方式就行了。 即定義常量時const 在型別名的前面。

二、const 的引用

int i1=512;

double d=3.14;

const int &r1=i1;

const int &r2=d;

上面的兩種寫法都是正確的,我們定義的兩個引用r1, r2都是指向 const int 型的引用。但是 i1, d 並不是const int型的呀。 其實,c++實現的機制會用乙個臨時變數來完成的。

即 執行 const int &r1=i1;時,會利用臨時變數來完成,這裡我們假設系統用temp來作為臨時變數。

const int temp= i1; 

const int &r2=temp;

這種方式的,主要應用於函式傳參時,

如我們有乙個函式,我們不想函式在執行的過程進更改我們引數的值,我們可以通過傳值的方式來完成。但是通過傳遞引用我們效率會更加的高,尤其當引數是類物件時。這時會可以把引數設定成const型別的。

funcmax(const int & a, const int b);

但是我們呼叫時,則可以用func(512,3.14)來呼叫。 這是因為temp臨時變數的機制。

很明顯 我們用 const int i1=512,; const int  i2=1024;

然後用引用 

const int &r1=i1;

const int &r2=i2;

必然是正確的呀。

3) 但是 

const int i1=4;

int &r2=d;

則是錯誤的。 因為此時i1是乙個整型常數,我們不能非常量引用去引用乙個常量。

三、 指標和const 

1) 當我們定義了乙個常量物件,我們想用乙個指標指向該常量物件的位址時,則只能使用指向常量的指標(pointer to const)來完成了。

如:

const double pi=3.14;

const double *pp=π

2)而
double *ptr=&pi是錯誤的。

因為pi是乙個常量,其位址也是乙個常量。

3)、各引用一樣,也可以利用臨時變數的實現機制來實現下面的賦值。

double pi=3.14;

const double *pp=π

pp=nullptr;
const int *ipp=π
都是正確的。

這種方式也主要是應用在引數傳遞時,保證引數的值不被改變。即*pp, *ipp不會被改變,但是pp ,ipp的指向卻是可以改變的。

我們的pp, ipp指向的是const 物件,但是 pp,ppi  本身不是const的呀,不是常量,我們怎麼把pp,ipp也定義成常量那,即定義常量指標。

用const double * const pp=π 就行了。

記住此時,pp也是常量啦, 其值必須初始化,其指向不能改變。 而且此時,*pp也不能改變。

因為pp定義的指向是const double 型別的。

如果想定義pp不能改變,但*pp可以改變,則可以用下面的定義方式了。

double  * const pp=π

注意:引用不是物件,只是別名所以引用沒用常量引用。

四、頂層const 和底層const

在乙個宣告語句中,當把乙個變數定義成了常量,則const就是頂層const,而宣告其指向必須為乙個常量時,則為底層const.

對於  const double * const pp=π 而言。 //第乙個const 為底層const ,第二個const為頂層const.

頂層const和底層const 在執行物件的拷貝操作時是有區別的,即頂層const不受影響,但底層const會受影響。

如上面的 二、3)和三、2)部分都是錯誤的。因為左邊的變數並沒具備相同的底層const。

所以,當進行拷貝時,左邊變數應和右值具有相同的底層const,或, 左邊的變數有底層const而右邊的變數不具有const(此時會利用臨時變數來完成拷貝如上面提到的:二、1)和三,3)部分)。

C中const關鍵字

const 用法 定義常量,修飾指標 函式的輸入引數和返回值,把定義或者修飾的變數屬性設為唯讀。本質上它只是在全域性資料段或者棧中定義的是乙個唯讀的常量,不是真正位於字串常量區。所以關鍵字const 並不能把變數變成真正的常量,事實上還是可以改變 const 定義的變數的值。const 的目的是為了...

C 中const關鍵字

一 const修飾指標變數 int num 0 1.const在 前面,表示const修飾指標指向的內容 const int p intconst p 2.const在 後面,表示const修飾指標變數 int const p 二 const修飾成員函式首先來看一下普通成員函式 class a fu...

C 中」const「關鍵字

關於c 中的const關鍵字的用法非常靈活,而使用const將大大改善程式的健壯性,現將本人的一些體會總結如下,期望對大家有所幫助 一 丶const基礎 如果const關鍵字不涉及到指標,我們很好理解,下面是涉及到指標的情況 int b 500 const int a b 1 int const a...