1. 程式人生 > >C++ 中的 const 限定符

C++ 中的 const 限定符

 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