引用是c++引入的新類型,所以c++引用的語義讓很多新手頗為頭疼。
引用就是一個對象的別名。對於一個變數的引用進行操作,作用效果會直接反映到這個變數上。
引用在聲明的時候必須要初始化,否則編譯器會提示錯誤,所以引用一定不為空白。
int i = 20;
int& j = i;
int& k; //錯誤,必須要初始化
++j; //引用j本身不變,執行的是i++
extern int& k; // ok,k在別的地方被定義
另外,對引用進行取地址操作,返回的是引用指向的對象的地址。在一般的情況下,編譯器不會為引用分配空間。編譯器編譯的時候,看到引用,只是在符號表裡增加一個記號。
引用作為類的member成員時,編譯器會為它分配空間。
引用的生命期就是它所引用的對象的生命期。加入一個對象失效了,那麼它的引用必然會失效。所以在函數裡返回一個局部對象的引用是很危險的。比如說:
int& func()
{
int i = 20;
int& k = i;
return k; //返回一個局部對象的引用,函數調用後,k所以用的i已經失效。
}
記得以前面試的時候,遇到這樣一個面試題:
int*& 和 int&* 分別代表什麼意思?
很遺憾那時我第一次遇到這個問題,沒有答上來。正確答案是:
int*& 聲明的是指向int型指標的引用,而int&*不是合法的聲明。指向引用的指標是非法的,因為引用根本不佔記憶體。
相對於引用,指標的語義相對簡單很多。回到本文的標題,什麼情況下改用引用,什麼情況下改用指標呢?
由於引用的一旦初始化便不可修改的特點,如果你知道可以總是指向一個對象,一旦指向一個對象,便不需要修改的時候,可以選擇引用。如果有可能指向,有可能不指向,那麼要使用指標。
另外,引用一般用於參數的傳遞,用來防止對象的拷貝帶來的開銷。用於傳遞對象參數時,建議使用引用。
還有,為容器定義[]操作符是,返回的是引用。此時返回指標總是怪怪的。
由於指標和引用有著不同的語義,所以大家在使用時,一定要明白語義上的差別,以免發生不必要的麻煩。