const int a = 0;
const int *pa = &a; // 指向常量的指針,不能通過pa改變a的值
int b = 0;
const int *pb = &b; // b不是常量,但是不能通過pb來修改b的值
int c = 0;
int * const pc = &c; // 常量指針,pc是一個常量,不能改變pc的值
const int d = 0;
const int * const pd = &d; // 指向常量的常量指針,pd不能改變,也不能通過pd修改d的值
判斷方式可以採取從右往左看,也可以通過‘*’來區分,const在‘*’左邊修飾所指變量,在右邊修飾指針本身。
頂層const:指針本身是常量;
底層const:指針所指的對象常量。
常量表達式:值不會改變並且在編譯過程就能得到計算結果的表達式。
const int sz = get_size(); // 不是常量表達式,因爲結果在運行時獲得。
將變量聲明爲constexpr類型,由編譯器來驗證變量的值是否是一個常量表達式。聲明爲constexpr的變量一定是一個常量,而且必須用常量表達式初始化。此時不能使用普通函數作爲constexpr變量的初始值,但是允許定義一種特殊的constexpr函數,簡單地在編譯時就能計算出結果,此時可以用constexpr函數去初始化constexpr變量。
在constexpr聲明中定義一個指針,constexpr僅對指針有效,與指針所指對象無關。
int a = 1;
constexpr int *pa = &a; // pa是一個指向整數的常量指針