聊聊C++關鍵字const

面試的時候被問到const關鍵字,我只說出了幾條,沒說全,感覺面試官很不滿意,回去就惡補了一下,現在跟大家分享一下:
(1)const變量和對象一旦定義就不能改變,故必須初始化
(2)默認狀況下,const對象只在文件內有效。如果想在多個文件共享const對象就必須在變量定義前加extern關鍵字
(3)const的引用:把引用綁定到const上就像綁定到其他對象上一樣,稱之爲對常量的引用。與普通引用不同的是對常量的引用不能被用作修改他所綁定的對象

const int ci=1024;
const int &r1=ci;
r1=42;//錯誤,r1是對常量的引用
int &r2=ci;//錯誤:試圖讓非常量引用指向一個常量對象

(4)對const的引用可能引用一個非const的對象:

int i=42;
int &r1=i;//引用r1綁定對象i
const int &r2=i;//r2也綁定對象i,但不允許通過r2修改i的值,卻可以通過r1修改i的值
r1=0;
r2=0;//錯誤,r2是一個常量引用

(5)指針和const:
指針是對象而常量不是,因此允許把指針本身定爲常量 常量指針必須初始化而且一旦初始化就不能改變其指向。把*放在const前面說明指針是一個常量,即不變得是指針本身得值而非他所指向對象的值。指針本身是一個常量並不意味着不能通過指針修改他所指對象的值,這取決於所指對象的類型,如果所指對象爲常量而無法修改。
(6)頂層const和底層const:
頂層const:可以表示任意對象是常量,對任何數據類型都適用
底層const:與引用和指針等複合類型的基本類型部分有關。指針類型既可以是頂層const也可以是底層const,而引用類型只存在底層const

int i=0;
int *const p1=&i;//不能改變p1的值,這是一個頂層const
const int ci=42;//不能改變ci的值,頂層const
const int *p2=&ci;//允許改變p2的值,底層const
const int *const p3=p2;//靠右的const是頂層const,靠左的const是底層const,導致既不能修改p3的值也不能通過p3修改其所指對象的值
const int &r=ci;//用於申明引用的const都是底層const

當執行對象拷貝時頂層const和底層const有區別:
執行對象拷貝時對頂層const不受影響,但對底層const有影響。拷入和拷出的對象必須有相同的底層const資格或兩個數據類型可以轉換。如:非常量可以轉換爲常量,反之不行

int *p=p3;//錯誤,p3包含底層const而p沒有
p2=p3;//正確,p2和p3都有底層const
p2=&i;//正確,int *能轉換成const int *
int &r=ci;//錯誤,普通int &不能綁定到int常量上
const int &r2=i;//正確,const int &可以綁定到普通int

(7)constexpr 和常量表達式
C++11新標準規定允許將變量聲明爲constexpr類型以便編譯器來驗證變量的值是否是常量表達式。聲明爲constexpr的變量必須用常量表達式去初始化

constexpr int mf=20;
constexpr int limit=mf+1;//mf+1是常量表達式
constexpr int sz=size();//只有當size()是一個constexpr函數時才正確

指針和constexpr
如果用constexpr定義了一個指針,則限定符僅對指針本身有效,與指針所指對象無關。constexpr把所定義的對象置爲頂層const
(8)const形參和實參:
當形參有頂層const時,傳遞給他常量對象或非常量對象都是可以的。當我們不希望形參在函數中改變時就可以用const修飾形參
(9)const修飾函數:
聲明一個成員函數的時候用const關鍵字是用來說明這個函數是 “只讀(read-only)”函數,也就是說明這個函數不會修改任何數據成員(object)。 爲了聲明一個const成員函數, 把const關鍵字放在函數括號的後面。聲明和定義的時候都應該放const關鍵字。
任何不會修改數據成員的函數都應該聲明爲const類型。如果在編寫const成員函數時,不慎修改了數據成員,或者調用了其它非const成員函數,編譯器將指出錯誤,這無疑會提高程序的健壯性。當const在函數名前面的時候修飾的是函數返回值.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章