C++學習之引用

1. 引用的定義及意義

a. 引用的定義

引用必須初始化。由於引用一經定義,它就不能再指向其餘對象了,因此須要進行初始化。git

type & quote_name=var_name;

但引用不能用引用對象的地址進行初始化。若是想對對象的地址進行引用,能夠定義一個指針引用。github

b. 引用的意義

int a=10;
int &b=a;

這裏,b就是一個引用,b實際上指向的是a的地址,但它不是指針,是引用,是a的別名,a能作的b都能作。函數

2. 引用的應用

實際應用中,引用主要被用來做爲函數的形式參數。
引用在內部存放的是一個對象的地址,它是該對象的別名。對於不可尋址的值,如字符串常量,以及不一樣類型的對象,編譯器爲了實現引用,必須生成一個臨時對象,引用實際上指向該對象,但用戶不能訪問它。這時當引用用來做爲函數形參時就引入了const引用問題。指針

3. const 引用問題

  • const 引用能夠用不一樣的類型對象初始化(只要類型之間能夠默認轉換便可),也能夠是不可尋址的值,如字符串常量。非const 引用不行。
double  dvar=2.12;
int     & nvar=dvar;             //Wrong
int     const& cnvar=dvar;       //OK
double  & cdqvar=dvar+1.0;      //Wrong
double  const& cdqvar=dvar+1.0;  //OK

https://github.com/bbxytl/bbxytl.github.com/raw/master/blog/pages/images/blog_2/1_invalid.png

  • 編譯器在處理引用時,會將其轉換以下,生成一個臨時對象。
double  dvar=2.12;
int     const& cnvar=dvar;
///編譯器轉換--Beg
int     tmp=dvar;           //double -> int
int     const& cnvar=tmp; 
///End
  • 不容許非const引用指向須要臨時對象的對象或值,即,編譯器產生臨時變量的時候引用必須爲const 。
int nvar=100;
int * &pqvar=&nvar;      //Wrong , &nvar 產生了一個臨時的對象,引用必須爲const
int * const & pcqvar=&nvar; //OK

int const nvar0=100;
int * &pqref=&nvar0;    //Wrong, 非const引用是非法的
int const * &pcqref=&nvar0; //Wrong, 須要臨時變量,且由於nvar0是一個常量,因此須要一個常量指針,以確保不能修改nvar0的值,而pcqref是一個很是量指針
int const * const &cpcqref=&nvar0; //OK
int const *p = &nvar0;
int const * &ref = p;  //OK

注:常量指針和指針常量code

int a;
int * const p = &a    //指針常量,*p能夠修改:*p = 8;(OK)
                      //p不能夠修改: p++;(ERROR)
int a,b;
const int *p = &a;   //常量指針,*p不可修改:*p = 8;(ERROR)
                      //p 能夠修改: p = &b  (OK)

總結:對象

  • 不容許非const引用指向須要臨時對象的對象或值
  • 地址值是不可尋址的值
  • const引用表示,試圖經過此引用去(間接)改變其引用的對象的值時,編譯器會報錯。這並不意味着原來的對象也變成const類型了,咱們仍然能夠經過原對象來更改對象的值,達到更改引用對象的值的目的。
int nvar=100;
int const &ref=nvar;
nvar++;     //OK
//ref++;    //Wrong
cout<<nvar<<endl<<ref<<endl;
///輸出:
101
101

附錄

相關文章
相關標籤/搜索