一、使用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...