1. 程式人生 > >const限定符

const限定符

操作 out 區別 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 
 3
const 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限定符