|
引用就是對象的另一個名字。在實際程序中,引用主要用作函數(shù)的形式參數(shù)。在引用的情況下,每一種引用類型都“關(guān)聯(lián)到”某一其他類型。不能定義引用類型的引用,但可以定義任何其他類型的引用。
引用必須用與該引用同類型的對象初始化:
int ival = 1024; int &refVal = ival; // ok: refVal refers to ival int &refVal2; // error: a reference must be initialized int &refVal3 = 10; // error: initializer must be an object const 引用:
const 引用是指向 const 對象的引用:
const int ival = 1024; const int &refVal = ival; // ok: both reference and object areconst int &ref2 = ival; // error: non const reference to aconst object 可以讀取但不能修改 refVal ,因此,任何對 refVal 的賦值都是不合法的。這個限制有其意義:不能直接對 ival 賦值,因此不能通過使用 refVal 來修改ival。
同理,用 ival 初始化 ref2 也是不合法的:ref2 是普通的非 const 引用,因此可以用來修改 ref2 指向的對象的值。通過 ref2 對 ival 賦值會導(dǎo)致修改const 對象的值。為阻止這樣的修改,需要規(guī)定將普通的引用綁定到 const 對象是不合法的。 const 引用可以初始化為不同類型的對象或者初始化為右值,如字面值常量:
int i = 42; // legal for const references only const int &r = 42; const int &r2 = r + i; 同樣的初始化對于非 const 引用卻是不合法的,而且會導(dǎo)致編譯時錯誤。觀察將引用綁定到不同的類型時所發(fā)生的事情,容易理解上述行為,假如我們編寫 double dval = 3.14; const int &ri = dval; 編譯器會把這些代碼轉(zhuǎn)換成以下形式的編碼: int temp = dval; // create temporary int from the double const int &ri = temp; // bind ri to that temporary 如果 ri 不是 const,那么可以給 ri 賦一新值。這樣做不會修改 dval,而是修改了 temp。期望對 ri 的賦值會修改 dval 的程序員會發(fā)現(xiàn) dval 并沒有被修改。僅允許 const 引用綁定到需要臨時使用的值完全避免了這個問題,因為 const 引用是只讀的。 |
|
|