C++/C中const,常量引用等小細節

引用

引用該博客:點擊查看

定義:

引用是對象的別名,引用本身不是對象,它只是已經存在的對象的另一個名字;

故所有對引用的操作均是對它所代表的對象的操作;

 

初始化:

定義一個引用的時候,必須初始化,其初始化值必須是一個對象;一般變量在初始化的時候,初始化值會被拷貝到這個變量對象中去;

由於引用本身不是對象,所以其初始化只是將它綁定到初始值對象上,而且引用一旦初始化完成,引用將始終和它的初始值對象綁定在一起,

無法再綁定其他的對象,因此定義引用必須初始化;


 
  1. int a = 1;

  2. int &ra = a;//定義一個引用ra,並將它綁定到a上

  3. ra++; //現在ra是a的別名,對ra的操作,其實是對a的操作

引用的類型要與它綁定的對象嚴格的匹配,並且引用只能綁定到對象上:

以下初始化方式是錯誤的:


 
  1. int &rb = 10;//錯誤,初始化值必須是一個對象

  2. double d = 3.14;

  3. int &rd = d; //錯誤,類型不匹配

const引用

定義:

將引用綁定到const對象上,則稱這個引用爲常量引用;

因此不能通過常量引用去修改它綁定的對象的值,因爲其對象是const的;

 

初始化常量引用:

與前面普通引用的初始化不同,常量引用允許用任意表達式作爲其初始值,只要該表達式的結果可以轉換成引用的類型即可;


 
  1. 1. const int &rb = 1;//允許將引用綁定到字面值上

  2. 2. const int &rc = r1 * 2;//允許將引用綁定到常量表達式上

  3. 3. double d = 3.14;

  4. const int &rd = d;//允許

上面的三個例子執行時,由於初始值爲不可尋址的值,或者類型不匹配的對象,編譯器會生成臨時對象,並將常量引用綁定到該臨時對象上;如:
3中,編譯器會先將double的d經過類型轉換放到一個整形的臨時對象中,然後將常量引用綁定到這個臨時對象:


 
  1. const int tmp = d; //生成臨時變量

  2. const int &rd = tmp; //綁定臨時變量

因此,對於普通的引用,綁定對象必須嚴格的匹配: 因爲如果類型不匹配,那麼定義的引用會被綁定到一個臨時對象上去,而在對引用做相

應的操作的時候,實際上操作的是臨時對象,並非初始化時想要綁定的對象!而對於常量引用,因爲其並不能修改綁定的對象,所以講起綁定到

臨時對象也是可以的。

 

由於const引用僅對引用可進行的操作作了限定,而對引用的對象本身是不是const沒有做限定:


 
  1. int i = 1;

  2. int &ri = i;

  3. const int &cri = i;

  4. i++; //合法

  5. ri++;//合法

  6. cri++;//非法,cri是個const引用

 

下面看幾個例子:


 
  1. const int ca = 1;

  2. int &rca = ca;//類型不匹配,將一個普通引用綁定到一個常量

  3.  
  4. int a = 1;

  5. int *&ra = &a; //錯誤,因爲ra爲非常量引用,而a的地址值不是對象,編譯器會產生臨時對象存儲a的地址值

  6. const int *&rb = &a; //錯誤,因爲rb也不是常量引用,等價於 int const *&rb = &a; rb爲綁定到一個指向int常量的指針的普通引用;

  7. const int * const &rc = &a; //正確,rc爲綁定到一個指向int常量的指針的常量引用

  8.  
  9. int *pa = &a;

  10. const int *&rd = pa;//正確

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章