引用
引用該博客:點擊查看
定義:
引用是對象的別名,引用本身不是對象,它只是已經存在的對象的另一個名字;
故所有對引用的操作均是對它所代表的對象的操作;
初始化:
定義一個引用的時候,必須初始化,其初始化值必須是一個對象;一般變量在初始化的時候,初始化值會被拷貝到這個變量對象中去;
由於引用本身不是對象,所以其初始化只是將它綁定到初始值對象上,而且引用一旦初始化完成,引用將始終和它的初始值對象綁定在一起,
無法再綁定其他的對象,因此定義引用必須初始化;
-
int a = 1;
-
int &ra = a;//定義一個引用ra,並將它綁定到a上
-
ra++; //現在ra是a的別名,對ra的操作,其實是對a的操作
引用的類型要與它綁定的對象嚴格的匹配,並且引用只能綁定到對象上:
以下初始化方式是錯誤的:
-
int &rb = 10;//錯誤,初始化值必須是一個對象
-
double d = 3.14;
-
int &rd = d; //錯誤,類型不匹配
const引用
定義:
將引用綁定到const對象上,則稱這個引用爲常量引用;
因此不能通過常量引用去修改它綁定的對象的值,因爲其對象是const的;
初始化常量引用:
與前面普通引用的初始化不同,常量引用允許用任意表達式作爲其初始值,只要該表達式的結果可以轉換成引用的類型即可;
-
1. const int &rb = 1;//允許將引用綁定到字面值上
-
2. const int &rc = r1 * 2;//允許將引用綁定到常量表達式上
-
3. double d = 3.14;
-
const int &rd = d;//允許
上面的三個例子執行時,由於初始值爲不可尋址的值,或者類型不匹配的對象,編譯器會生成臨時對象,並將常量引用綁定到該臨時對象上;如:
3中,編譯器會先將double的d經過類型轉換放到一個整形的臨時對象中,然後將常量引用綁定到這個臨時對象:
-
const int tmp = d; //生成臨時變量
-
const int &rd = tmp; //綁定臨時變量
因此,對於普通的引用,綁定對象必須嚴格的匹配: 因爲如果類型不匹配,那麼定義的引用會被綁定到一個臨時對象上去,而在對引用做相
應的操作的時候,實際上操作的是臨時對象,並非初始化時想要綁定的對象!而對於常量引用,因爲其並不能修改綁定的對象,所以講起綁定到
臨時對象也是可以的。
由於const引用僅對引用可進行的操作作了限定,而對引用的對象本身是不是const沒有做限定:
-
int i = 1;
-
int &ri = i;
-
const int &cri = i;
-
i++; //合法
-
ri++;//合法
-
cri++;//非法,cri是個const引用
下面看幾個例子:
-
const int ca = 1;
-
int &rca = ca;//類型不匹配,將一個普通引用綁定到一個常量
-
int a = 1;
-
int *&ra = &a; //錯誤,因爲ra爲非常量引用,而a的地址值不是對象,編譯器會產生臨時對象存儲a的地址值
-
const int *&rb = &a; //錯誤,因爲rb也不是常量引用,等價於 int const *&rb = &a; rb爲綁定到一個指向int常量的指針的普通引用;
-
const int * const &rc = &a; //正確,rc爲綁定到一個指向int常量的指針的常量引用
-
int *pa = &a;
-
const int *&rd = pa;//正確