const的引用
對常量的引用:把引用綁定到const對象上,就像綁定到其他對象上一樣,不能被用作修改它所綁定的對象:
const int ci = 1024; const int &r1 = ci;//正確:引用及其對應的對象都是常量 r1 = 42;//錯誤:r1是對常量的引用 int &r2 = ci;//錯誤:試圖讓一個非常量引用綁定一個常量
因為不允許直接為ci賦值,所以也就不能通過引用去改變ci。
初始化和對const的引用
在初始化常量引用時允許任意表達式作為初始值,只要該表達式的結果能轉換成引用的類型,允許為一個常量引用綁定非常量的對象、字面值,甚至是個一般表達式:
int i = 42; const int &r1 = i;//允許const int&綁定到一個普通int對象上 const int &r2 = 42;//正確:r1是一個常量引用 const int &r3 = r1 * 2;//正確:r3是一個常量引用 int &r4 = r1 * 2;//錯誤:r4是一個非常量引用
當一個常量引用被綁定到另外一種類型上:
double dval = 3.14; const int &ri = dval;
ri引用了一個int型的數,對ri的操作應該是整數運算,但dval卻是一個雙精度浮點數而非整數,為了確保讓ri綁定一個整數,編譯器把上述代碼變成如下形式:
const int temp = dval;//由雙精度浮點數生成一個臨時的整型常量 const int &ri = temp;//讓ri綁定這個臨時常量
臨時量對象:當編譯器需要一個空間來暫存表達式的求值結果時臨時創建的一個未命名的對象。
對const的引用可能引用一個並非const的對象
常量引用僅對引用可參與的操作做出了限定,對於引用的對象本身是不是一個常量未作限定:
int i = 42; int &r1 = i;//引用ri綁定對象i const int &r2 = i;//r2也綁定對象i,但是不允許通過r2修改i的值 r1 = 0;//r1並非常量,i的值修改為0 r2 = 0;//錯誤:r2時一個常量引用