const限定符總是讓人很頭疼,下面講解一下幾個比較容易混淆的概念:
- 對常量的引用(常量引用):
一般情況下,引用的類型要與其所引用的對象的類型一致,其中的例外情況就是,當初始化常量引用時,允許用任意表達式作為初始值,只要改表達式能轉換成引用的類型即可。
const int i = 1;
const int &ri = i;
int i = 42;
const int &r1 = i;
const int &r2 = 42;
- 指向常量的指針
和引用類似,一般情況下,指針的類型應該與其指向的對象的類型一致,但是允許一個指向常量的指針指向一個非常量對象。
const int i = 4;
const int *cptr = &i;
int a = 1;
cptr = &a;
- 常量指針
由于指針本身就是一個對象,因此可以定義一個指針為常量指針,必須被初始化。當常量指針指向一個對象時,那么這個指針永遠只能指向這個對象,但是被指向的對象的值能否改變,取決于被指向的對象本身是否是一個常量。
int i = 1;
int *const cp = &i;//cp永遠指向i,
i = 2;//由于i是非常量,其值可以改變
const int c = 2;
const int *const p = &c;//p是一個指向常量的常量指針
c = 1;//錯誤,c為常量,其值不能被改變
p = &i;//錯誤,p是一個常量的指針,其指向不能改變
- 頂層const與底層const
頂層const表示指針本身就是一個常量,而底層const表示指針所指的對象是一個常量。
int i = 0;
int *const pi = &i;//pi的值不能被改變,pi為頂層const
const int ci = 42;//ci是一個int類型的常量,值不能被改變,為頂層const
const int *p2 = &ci;//p2是一個指向常量的指針,p2的值可以改變,所以p2為底層const
const int *const p3 = p2;//靠右的const是頂層const,靠左的const是底層const
const int &r = ci;//用于聲明引用的const都是底層const