const 限定修飾符
常量,在程序中任何改變這個值的企圖都將導致編譯錯誤 因此 它被稱爲是只讀的[read- only]。因爲常量在定義後就不能被修改,所以它必須被初始化。未初始化的常量定義將導致編譯錯誤 。
minWage 是一個常量對象 因此它不能被改寫爲一個新的值
const double minWage = 9.60;
cptr 是一個指向double 類型的const 對象的指針
const double *cptr;
我們可以從右往左把這個定義讀爲: cptr 是一個指向double 類型的 被定義成const 的對象的指針。此中微妙在於cptr 本身不是常量 我們可以重新賦值cpt,使其指向不同的對象 但不能修改cptr 指向的對象。例如
const double *pc = 0;
const double minWage = 9.60;
// ok: 不能通過 pc修改 minWage
pc = &minWage;
double dval = 3.14;
// ok: 不能通過 pc修改 dval
// 雖然 dval本身不是一個常量
pc = &dval; // ok
dval = 3.14159; // ok
*pc = 3.14159; // 錯誤
const 對象的地址只能賦值給指向const 對象的指針 例如pc 但是指向const 對象的指針可以被賦以一個非const 對象的地址 例如
pc = &dval;
雖然dval 不是常量 但試圖通過pc 修改它的值 仍會導致編譯錯誤 因爲在運行程序的任意一點上 編譯器不能確定指針所指的實際對象
在實際的程序中 指向const 的指針常被用作函數的形式參數 它作爲一個約定來保證被傳遞給函數的實際對象在函數中不會被修改
引用類型
引用 reference 有時候又稱爲別名[alias]。引用類型由類型標識符和一個取地址操作符來定義 引用必須被初始化
例如
int ival = 1024;
// ok: refVal是一個指向 ival的引用
int &refVal = ival;
// 錯誤 引用必須被初始化爲指向一個對象
int &refVal2;
引用也可以被用作一種指針 我們可以定義一個指針引用 例如
int ival = 1024;
// 錯誤 refVal是 int類型, 不是 int*
int &refVal = &ival;
int *pi = &ival;
// ok: refPtr是一個指向指針的引用
int *&ptrVal2 = pi;
一旦引用已經定義 它就不能再指向其他的對象
int min_val = 0;
// ival被設置爲 min_val 的值
// refVal並沒有引用到 min_val 上
refVal = min_val;
以上代碼等價於ival=0
const 引用可以用不同類型的對象初始化(只要能從一種類型轉換到另一種類型即可),也可以是不可尋址的值,如文字常量 例如
double dval = 3.14159;
// 僅對於 const引用纔是合法的
const int &ir = 1024;
const int &ir2 = dval;
const double &dr = dval + 1.0;
同樣的初始化對於非const 引用是不合法的 將導致編譯錯誤