引用是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&*不是合法的宣告。指向引用的指標是非法的,因為引用根本不佔記憶體。
相對於引用,指標的語義相對簡單很多。回到本文的標題,什麼情況下改用引用,什麼情況下改用指標呢?
由於引用的一旦初始化便不可修改的特點,如果你知道可以總是指向乙個物件,一旦指向乙個物件,便不需要修改的時候,可以選擇引用。如果有可能指向,有可能不指向,那麼要使用指標。
另外,引用一般用於引數的傳遞,用來防止物件的拷貝帶來的開銷。用於傳遞物件引數時,建議使用引用。
還有,為容器定義操作符是,返回的是引用。此時返回指標總是怪怪的。
由於指標和引用有著不同的語義,所以大家在使用時,一定要明白語義上的差別,以免發生不必要的麻煩。
什麼時候使用引用 什麼時候使用指標
使用引用引數的主要原因有兩個 程式設計師能修改呼叫函式中的資料物件 通過傳遞引用而不是整個資料 物件,可以提高程式的執行速度一般的原則 對於使用引用的值而不做修改的函式 如果資料物件很小,如內建資料型別或者小型結構,則按照值傳遞 如果資料物件是陣列,則使用指標 唯一的選擇 並且指標宣告為指向cons...
什麼時候使用引用
當必須指向乙個物件並且不想改變其指向時,或者在過載操作符並為防止不必要的語義誤解時,你應該使用引用 而在除此之外的其他情況下,則應使用指標。下面這個例子是引用指向乙個物件並且不會改變其指向,這個 new出來的物件 只能被引用改變。關於在過載操作符並為防止不必要的語義誤解時使用引用,參考 more e...
什麼時候該休息
睡眠是身體進行自我調整的時刻,你侵略它的時間,它便侵略你的健康 有些人原本一向身體健康,但在連續熬夜數晚後,突然第二天起床會覺得很疲勞,一閉眼就想睡覺,而且會腰痠背痛,但一到晚上精神又好起來!別以為這是小事!根據中醫的看法,是因過勞而造成體內器官陰陽失調,就是體內器官起內訌,互相打架,最後造成器官衰...