const限定符
const能對變量加以限定,使其值不可修改。如:
const int inf = 0x3f3f3f3f;
任何試圖修改變量inf的值的操作都將引起編譯錯誤。
因為 const 對象一旦創建後就不能修改,所以const對象必須初始化。
const的引用:
可以把引用綁定到const對象上,就像綁定到其他對象上一樣,我們稱之為對常量的引用。與普通引用不同的是,對常量的引用不能用作修改其對象的值。
如:
const int x = 0;
const int &p = x;
任何嘗試修改p的值的操作都將引發編譯錯誤。雖然不能直接修改const int &變量的值,不過在某些情況下可以間接修改const int &變量的值。
如:
對const的引用可以引用一個非const的對象,可以通過改變非const對象的值來改變const的引用的值。
1 int x = 0; 2 3 const int &p = x; 4 5 x += 1; 6 7 cout << p << " " << x << endl;//輸出1 1
因為x不是const變量,其值可以被修改,而p是x的引用,修改x的值即修改了p的值。
const的引用可以可以初始化為一個字面常量,如:
const int &p = 0;
指針和const:
與引用一樣,也可以令指針指向常量或非常量。類似於常量引用,指向常量的指針不能用於改變其所指對象的。想要存放常量對象的地址只能用對應的常量指針。而常量指針可以指向對應的非常量對象,這點是和常量引用一樣的。
1 const int cnt1 = 0; 2 3 int cnt2 = 1; 4 5 const int p1 = &cnt1; 6 7 const int p2 = &cnt2;
指向const對象的指針:
const int cnt = 1;
const int *p = &cnt;
上述語句聲明的是一個指向常量int變量的指針。所謂指向常量的指針僅僅要求不能通過改變指針來改變對象的值,而沒有規定該對象的值不能通過其它途徑改變。因為指針p本身並不是一個常量,因此可以令p指向另外一個對象。
即:
1 const int cnt = 1; 2 3const int *p = &cnt; 4 5 *p += 1; 6 7 //是非法的 8 9 const int cnt = 1; 10 11 const int x = 0; 12 13 const int *p = &cnt; 14 15 p = &x; 16 17 //是合法的
const 指針:
int cnt = 0;
int *const p = &cnt;
通過從右往左解讀p的聲明語句可以知道,首先p是一個const變量,然後是一個指向int性的指針。因此與上面的p不能改變對象的值但可以指向另外一個對象相反,這裏的p可以改變其所指的對象的值,但p本身的值不能改變,即不能指向其他的對象。
即:
1 int cnt = 0; 2 3 int x = 1; 4 5 int *const p = &cnt; 6 7 p = &x; 8 9 //是不合法的 10 11 int cnt = 0; 12 13 int *const p = &cnt; 14 15 *p += 1; 16 17 //是合法的
指向常量的常量指針:
const int cnt = 1;
const int *const p = &cnt;
上述語句聲明的是一個指向常量的常量指針。即不能通過改變p來改變p所指的對象的值,也不能改變p的值(p不能指向其它對象)。
頂層 const 和底層 const :
頂層const表示指針本身是一個常量,底層const表示指針所指的對象是一個常量。頂層const和底層const是相互獨立的。
更一般的,頂層const可以表示任意對象本身是一個常量,這一點對任何數據類型都適用,如算術類型,類,指針等。底層const則與指針和引用等符合類型的基本類型部分有關。比較特殊的是指針類型既可以是頂層const也可以是底層const,這一點和其他類型區別明顯。
const限定符