頂層const表示指針本身是一個常量,底層const表示指針所指向的對象是一個常量。
首先對於普通常量的定義:
int const a = 40;
const int a = 40;
這兩種定義的形式表示的意義是相同的。
再說對於指針的定義:
int b = 20;
int *const p = &b;
這樣的定義表示指針p本身是一個常量,它的地址和它指向的對象都是不能被改變的。是一個頂層const。
const int *q = &a;
這樣的定義表示的是指針q指向一個常量,它所指向的對象的值是不能被改變的,但是這個指針本身並不是常量。這是一個底層const
const int *const x = q;
這樣的定義表示指針x是一個常量,並且這個指針指向一個常量。其中靠左邊的const是底層const,靠右邊的常量是一個頂層const。
constexpr和常量表達式
常量表達式是指值不會改變並且在編譯過程中就能計算出結果的表達式。
例如:
const int a = 20;
const int b = a + 1;
const int c = getSize();//錯誤,c會在運行時被初始化
constexpr變量
在c++11新標準中,允許將變量聲明成constexpr類型以便由編譯器來驗證變量的值是否是一個常量表達式。