1.const 對象必須初始化,因為一旦創建後值不能改變。
Eg:
const int i = GetSize(); //正確:運行時初始化
const int j = 42; //正確:編譯時初始化
j = 33; //錯誤:試圖向const對象寫值
const int k; //錯誤:k是一個未經初始化的常量
2.默認狀態下,const對象僅在文件內有效。
若想在多個文件內工作,只在一個文件中定義const,而在其他多個文件中聲明並使用它。
解決辦法,對於const變量,不論聲明定義都加extern,這樣只需定義一次即可。
Eg:
//file1.cc 定義並初始化一個常量,該常量能被其他文件訪問
Extern const int bufSize = fcn();
//file1.h
Extern const int bufSize; //與file1.cc 中定義的bufSize是同一個
3.把引用綁定到const對象上,稱之為 對常量的引用
Eg1:
const int c = 1024;
const int &r1 = c; //正確
r1 = 42; //錯誤:r1是對常量的引用
int &r2 = c; //錯誤:試圖讓一個非常量引用指向一個常量引用
Eg2: int i = 42;
const int &r1 = i; //允許將const int& 綁定到一個普通int上
const int &r2 = 42; //正確:r2是一個常量引用
const int &r3 = r1*2; //正確:r3是一個常量引用
int &r4 = r1 * 2; //錯誤:r4是一個普通的非常量引用
對const引用可能引用一個非const對象
Eg: int i = 42;
int &r1 = i;
const int &r2 = i; //r2綁定對象i,但不允許通過r2修改i值
r1 = 0; //r1並非常量,i的值為0
r2 = 0; //錯誤:r2是一個常量引用
引用一個非const對象,即對象是個非常量,所以允許通過其他途徑改變其值。
4.const指針
指針是對象,允許把指針本身定為常量。常量指針必須初始化,則指針的值(存放指針中的地址)不能再改變了。
把*放在const前,用以說明指針是一個常量,即不變的是指針本身而非指向的值。
Eg: int errNumb = 0;
int *const curErr = &errNumb; //curErr將一直指向errNumb
const double pi = 3.14159;
const double *const pip = π //pip指向常量對象的常量指針
從右往左讀:
①離curErr最近的是const,意味著curErr本身是一個常量對象。
②下一個是*,curErr是一個常量指針。
③int:常量指針指向一個int對象
同理,pip是一個常量指針,指向一個雙精度浮點型常量。
指針本身是一個常量並不意味著不能通過指針修改其所指對象的值。
Eg:分析int const *p, const int*p, int *const p , const int *const p的異同之處
int const *p, const int*p這兩個沒區別,p指向的地址可變,p指向的內容不可變,
int *const p , p指向的地址不可變,p指向的內容可變
const int *const p p指向的地址不可變,p指向的內容不可變
5.頂層const
頂層const 表示指針本身是個常量。
底層const 表示指針所指的對象是一個常量。
Eg:int i = 0;
int *const p1 = &i; //不能改變p1值,頂層
const int ci = 42; //不能改變ci值,頂層
const int *p2 = &ci; //允許改變p2值,底層
const int *const p3 = p2; //靠右的const頂層,靠左底層
const int & r =ci; //用於聲明引用的const都是底層const
執行對象拷貝操作:
頂層const不受影響:不會改變被拷貝對象的值,無影響。
Eg: i = ci; //正確:拷貝ci值,ci頂層const,無影響
p2 =p3; //正確:p2 p3指向對象類型相同。p3頂層const的部分不影響
底層const 限制不可忽略:執行對象拷貝操作,拷入拷出對象必須具有相同底層const資格,或者兩個對象的數據類型必須能夠轉換。一般,非常量可以轉換成常量,反之不行。
Eg: int *p = p3; //錯誤:p3包含底層const,p1無
p2 = p3; //正確:p2 p3 都是底層const
p2 = &i; //正確:int * 能轉換成 const int *
int &r = ci; //錯誤:試圖讓一個非常量引用指向一個常量引用
const int &r2 = i; //正確:r2綁定對象i,但不允許通過r2修改i值
//(對const引用可能引用一個非const對象)