關於C++引用的一些注意點

C++的引用首先跟指針的最大區別就是引用不是一個對象,而指針是一個對象;其次引用在其定義時就要初始化,而指針能夠不用。html

int    val = 42;
int    &rval = val;

此時rval就綁定了val,其實就是rval就是val的一個別名。你修改了兩個其中的一個,其值都會改變。spa

由於引用在一開始就初始化了,因此一個引用只能引用一個變量。還有,引用只能引用對象,也就是有地址的,不能是一個常數或者表達式。並且類型要匹配。指針

int    &rval = 10;    //error: initializer must be an object
double    dval = 3.14;
int    &rdval = dval;    //error: initializer must be an int object

References to const  常量引用code

不一樣於很是量的引用,常量引用所引用的對象不能修改htm

const    int    ci = 1024;
const    int    &r1 = ci;
r1 = 42;    //error: r1 is a reference to const
int    &r2 = ci;    //error: nonconst reference to a const object

由於ci是一個常量,因此咱們不能直接用一個引用來引用ci,由於咱們不能修改ci。對象

上面提到引用要引用正確的自身的類型,可是常量引用能夠引用一個非const的對象,一個數,或者表達式。blog

int    i = 42;
const    int    &r1 = i;       //ok
const    int    &r2 = 42;    //ok 
const    int    &r3 = r1 * 2;  //ok
int    &r4 = r * 2;    //error: 很是量引用不能引用一個表達式

讓咱們想一想這是爲何?ci

double    dval = 3014;
const    int    &ri = dval;    //ok

其實編譯器幫咱們多作了一步get

double    dval = 3014;
const    int    temp = dval;    //建立一個暫時的常量對象來存放dval             
const    int    &ri = temp;      //將引用到這個暫時的常量

正由於有這個無名的中轉存量,因此常量引用才能夠引用數,表達式,還有不一樣類型的對象。編譯器

那爲何很是量引用就不能這樣呢?

想一想,剛纔說的編譯器幫咱們弄了一箇中轉對象,其實咱們引用是引用它,修改也修改它, 但它是無名的,也就是找不到地址,也沒法找着。修改了也沒用,咱們是要修改dval(在上面列子中)。

因此說,只有常量引用才能夠引用數字,表達式,不一樣類型的對象。由於咱們不打算修改它,因此那個中轉變量真的只是負責傳遞值,讓常量引用初始化而已。(要是類型相同的話,就沒有必要建立無名中轉變量了,由於直接用來初始化均可以。感謝@Kvtis的指出)

最後一個例子

int    i = 42;
int    &r1 = i;
const    int    &r2 = i;
r1 = 0;    //ok
r2 = 0;    //error

 

這樣很是量引用和常量引用都引用一個值是能夠的。很是量引用就不用說了,跟對象綁在一塊兒,是別名,修改引用的同時也就修改了對象自己的內容。而常量引用,就是跟上面同樣,編譯器幫咱們建立了一個無名的中轉變量來儲存,其實也就是賦值給常量對象初始化。你不能修改它就是了。

相關文章
相關標籤/搜索