1. 程式人生 > >7 類-const成員

7 類-const成員

const成員變數

一、為什麼會引入const

有時需要定義一個不變的量,如:用一個變數來表示緩衝區大小。這時就引入了const關鍵字。

二、const變數的初始化

因為const變數一旦建立後其值就不能再被修改,所以const變數必須初始化。

/* cosnt 變數的兩種初始化方式 */
const int i = get_size(); //執行時初始化
const int j=42;             //編譯時初始化

/*const變數和普通變數的關係*/
int i = 42;
const int ci = i; //const變數ci可以用普通變數i賦值
int j = ci;         //
const變數ci可以給普通變數j賦值,相當於把ci的值拷貝一份給j,新物件和原來物件便沒有關係了

三、const物件僅在檔案內有效

預設情況下,const物件被設定為僅在檔案內有效,當多個檔案中出現了同名的const變數時,等同於分別定義了獨立的變數。

當以編譯時初始化定義一個const物件,編譯器在編譯過程中會把用到該變數的地方都替換成相應的值。

如果程式包含多個檔案,則每個用了const物件的檔案必須能訪問到它的初始值才行。為支援這一做法,同時避免對同一變數重複定義,對於const變數不管是宣告還是定義都新增extern關鍵詞。

//file.c定義並初始化一個常量,該常量能被其他檔案訪問
extern const int bufsize = fcn(); //file_1.h標頭檔案 extern const int bufsize; //與file.c中定義的bufsize是同一個

四、對const的引用(簡稱 "常量引用",即引用前面加const修飾詞的引用)

把引用繫結到const物件上,就叫對常量的引用。對常量的引用不能被用作修改它所繫結的物件。

const int ci = 1024;
const int &r1 = ci;     //引用及其對應的物件都是常量
r1 =42;                //錯誤,r1是對常量的引用
int &r2 = ci;          //
錯誤,不能用非常量引用指向常量物件

int i = 42;
const int &r1 = i; //允許將const int&繫結到普通物件上

總結:普通引用只能繫結到普通物件上,const引用可以繫結到普通物件或常量物件上。

五、指標和const

int i = 10;
const int *p1 = &i; //const放最前面表示不能通過指標p1修改i的值,但可以修改p1的指向
const int * const p2 = &i; //const放在最前面和指標變數前,表示即不能通過指標修改i的值,也不能修改p2 的指向

六、頂層const

頂層const指,表示指標本身是常量。

底層const指,指標所指向的物件是一個常量。

int i = 0;
int *const p1 = &i; //不能改變p1的值,這是一個頂層const
const int ci = 42;   //不能改變ci的值,這是一個頂層const
const int *p2 = &ci; //允許改變p2的值,這是底層const 
const int *const p3 = p2; //靠右的是頂層const,靠左的是底層const
const int &r = ci; //用於宣告引用的const都是底層const