C++ 中的 const 限定符
阿新 • • 發佈:2018-12-10
const 限定符
const int bufferSize = 1024;
const int k; // ERROR!
const 物件必須初始化, 且一旦建立後其值不能改變,因此只能在 const 物件上執行不改變其內容的操作。
預設情況下,const 物件被設定為僅在檔案內有效。當多個檔案中出現了同名的 const 變數時,其實等同於在不同檔案中分別定義了獨立的變數。如果想在多個檔案之間共享 const 物件,必須在變數的宣告和定義之前都新增 extern 關鍵字。
// file.cpp extern const int bufferSize = 512; // file.h extern const int bufferSize;
1. 對 const 的引用
const int ci = 1024; // 常量
const int &ref_ci = ci; // ref_ci 是一個對常量 ci 的引
ref_ci = 4; // ERROR! 不能通過 ref_ci 修改 ci 的值
int &ref_ci1 = ci; // ERROR! ci 是常量,但 ref_ci1 不是對 const 的引用,存在通過 ref_ci1
// 修改 ci 的隱患
在初始化常量引用時允許用任意表達式作為初始值
常量引用僅對引用可參與的操作做出了限定,對於引用的物件本身是不是一個常量未作限定
int i = 42; const int &ref_i1 = i; // ref_i1 是對 const 的引用,儘管它事實上引用的不是常量,但 ref_i1 不會 // 修改 i 的值,不過 i 的值可以通過別的途徑改變 ref_i1 = 43; // ERROR! ref_i1 是對 const 的引用,儘管它引用的 i 不是常量, // 但 ref_i1 單方面認為不可修改 i 的值 const int &ref_i2 = 42; // ref_i2 是對 const 的引用,允許用任意表達式作為初始值 const int &ref_i3 = ref_i1 * 2; // ref_i3 是對 const 的引用,允許用任意表達式作為初始值 int &ref_i4 = ref_i1 * 2; // ERROR! ref_i4 不是對 const 的引用,必須繫結至正確的物件
2. 指標和 const
2.1 指向 const 的指標
和引用一樣,(1)指向 const 的指標不能用於改變其所指物件的值;(2)要想存放 const 物件的地址,只能用指向 const 的指標;(3)指向 const 的指標可以存放非 const 的物件,但是不能通過該指標修改所指物件的值
const double dval = 3.14; // const 物件
const double *dval_ptr1 = &dval; // 指向 const 的指標
*dval_ptr1 = 3.0; // ERROR! 不能通過指向 const 的指標改變其所指的物件
double *dval_ptr2 = &dval; // ERROR! 只能用指向 const 的指標存放 const 物件的地址
double dval2 = 1.141;
const double *dval2_ptr = dval2; // Correct
*dval2_ptr = 1.732; // ERROR!
2.2 const 指標
指標是物件,所以指標本身也可以是一個 const 物件。對於 const 指標,不變的是指標本身,而非指標指向的物件。
int i = 1024, j = 4;
const int *i_ptr = &i; // 指向 const 的指標
int *const i_cptr = &i; // const 指標
i_cptr = &j; // ERROR! i_cptr 是 const 指標,作為一個 const 物件,它的值不能改變
*i_cptr = 512; // Correct. i_cptr 指向的是非常量 i,這裡通過 i_cptr 改變了 i 的值,
// 但 i_cptr 本身沒有改變,依然指向 i
2.3 指向 const 的 const 指標
const double dval = 3.14;
const double *const c_dval_cptr = &dval; // c_dval_cptr 本身是個 const 指標,所指向的也是一個
// const 物件
3. 頂層 const
頂層 const:物件本身是 const
底層 const:指標所指的物件是 const,或引用所繫結的物件是 const