學習C++ PRimer也有一段時間了,一直對const這個關鍵字比較模糊,一忘記就想翻書,這次正好借著這個機會,對這個關鍵字做一個總結,之間還穿插了指針的知識,方便后面的回顧。
(1)const的初始化 有時我們希望定義一種變量,它的值不能被改變。例如,用一個變量來表示緩沖區的大小。使用變量的好處是我們覺得緩沖區大小不再合適時,很容易對其進行調整,另一方面,也應隨時警惕防止程序一不小心改變了這個值。
const int buffersize=512;//輸入緩沖區的大小buffersize=500;//錯誤:試圖向const對象寫值以為const對象一旦創建后其值就不能再被改變,所以const對象必須被初始化。
const int i=get_size(); //運行時初始化const int j=42; //編譯時初始化const int k; //error:k是一個未經初始化的變量(2)const的引用 const的引用是理解的難點,我們可以把引用綁定到const的對象上,就像綁定到其他對象上一樣,可以稱之為對常量的引用(reference to const)。C++primer里面說其實并不存在常量引用:因為引用不是一個對象,所以我們沒有辦法讓引用本身恒定不變。我覺得這句話真正的理解是,這個引用變量本身是不能恒定不變的,因為它可以改變其綁定的引用對象(雖然C++并不允許隨意改變引用綁定的對象),但是對常量的引用這個說法確實成立的。在const的引用中,我們還應該注意幾點: a:與普通引用不同,對常量的引用不能被用作改變它所綁定的對象;
const int ci=1024; //對const的初始化,正確,引用對象const int &ri=ci; //引用及其對應的引用對象都是常量,正確r1=42; //錯誤,r1是常量的引用,所以r1的值不能被改變b:不可以試圖讓一個非常量引用指向一個常量引用
int &r2=ci; //errorc:對const的引用可能引用一個非const的對象,但是不可以通過常量引用去改變非常量對象的值
int i=42;int &r1=i;const int &r2=i; //錯誤,r2可以綁定對象i,但是不允許通過r2修改i的值(3)指針和const 和引用一樣,也可以令指針指向那個常量或者非常量,指向常量的指針(pointer to const)不能用于改變其所指對象的值,其定義非常類似上文中對”常量的引用”。
const double pi=3.14;double *ptr=π //錯誤,ptr是一個普通指針,所以其不能指向常量對象const double *cptr=π//正確,其可以指向一個雙精度常量*cptr=42;// 但是不能通過cptr賦值和常量引用一樣,指向常量的指針也沒有規定其所指向的對象必須是一個常量,可以換一個角度想一想,所謂指向常量的指針或者引用,其實不過是他們自以為是的的結果罷了,它們自覺地不去改變所指對象的值。 (4)const指針 指針是對象而引用不是,因此就像其他對象類型一樣,允許把指針本身定義為常量。常量指針(const pointer)必須初始化,而且一旦完成初始化,則它的值(也就是存放在指針中的那個地址)就不能再改變了。把*放在const之前用以說明指針是一個常量,這樣書寫說明不變的是指針本身這個值而不是指向的那個值。
int errNumb=0;int *const curErr=&errNumb;這里還有一個更復雜的寫法,用來定義一個指向常量對象的常量指針,*號前的const double 用來說明這個指針所指向的對象的類型:
const double pi=3.14159;const double *const pip=π新聞熱點
疑難解答
圖片精選