C FAQ閱讀筆記 2 引用

2021-03-31 08:57:01 字數 1558 閱讀 7051

[8.1] 什麼是引用?

乙個物件的別名(乙個替換的名字)叫引用

引用經常被用來做在函式引數的引用傳遞中

void swap(int& i,int& j)

int main()

這裡i和j是main是函式x和y的引用。換句話說,i就是x---不是說是x的乙個指標或說是x的拷貝,而是x本身,你對i做的一切都相當於直接對x進行操作,反之也是一樣的。

這樣就是你作為乙個程式對於引用應該了解的。現在,冒著通過給你乙個不同的視角來你感到迷惑的危險,解釋一下引用是如何實現的。在最底層中,物件x 的乙個引用i是物件x的機器位址。但是如果程式設計師執行i++的時候,編譯器會生成讓x自增的**。特別是,編譯器用來查詢x的的位址位並沒有發生改變。乙個c程式設計師會把這個想象為c中的指標呼叫。換句話說,c程式設計師會把i想象為*p的乙個,這裡p是指向x的乙個指標(例如,編譯器會自動地反引用底層的指什;i++就被換為成了(*p)++;i=7會自動被成*p=7)。

注意 : 甚至引用經常是通過使用底層的組合語言來實現的,請不要把引用想象成乙個物件的乙個長相奇怪的指標,乙個引用就是乙個物件。它不是指向物件的指標,也不是物件乙個拷貝。它就是那個物件。

[8.2] 如果對乙個引用賦值會發生什麼呢?

你可以改變乙個引用體(referent)的狀態(引用體referent就是引用引到的那個物件)

記住: 引用就是引用體,如果改變引用就可以直接改變引用體的狀態。用編譯器編寫者的術語來叫,乙個引用就是乙個"左值"("lvalue")(就是可以出現在的賦值符左端的東西)

[8.3] 當你返回乙個引用的時候會發生什麼?

函式呼叫可以出現在賦值運算子的左端。

這樣的能力開始可能會比較奇怪。例如,沒有人會覺得f()=7有意義。但是,如果a是乙個物件陣列裡的乙個物件,很多人都會覺得a[i]=7是有意義的甚至a[i]其實是乙個偽裝起來的函式呼叫(它就是資料的呼叫: array::operator(int),它就是陣列類的乙個子指令碼的運算子).

class array ;

int main()

[8.4] 如何讓乙個引用重新引用到另外乙個物件上?

這是不可能的

你不能把引用體從引用身上分離出來

與指標不一樣,如果乙個引用被繫結到物件中,它就可以重賦值到另乙個物件中。如果引用物件本身不是乙個物件(它沒有標誌資訊,取得引用的位址就得到了引用體的位址;記住,引用就是引用體自己)

在這種意義下,乙個引用與乙個常指標,比如說int* const p是相似的(與乙個像const int* p的指向常數的指標相反).儘管有這些相似性,請不要把引用與指標相混,它們是完全不一樣的東西。

[8.5] 我什麼時候用引用,什麼時候用指標呢?

只要能用就用引用,不得以的情況下再用指標。

當你不需要進行重賦值的時候,使用通常是比指標更好的解決方法。這通常就是說,引用是乙個類的公有成員介面最有用的部分。引用經常顯示乙個物件的外表,而指標通常是內部的內容。

上面所講的一種例外情況是當乙個函式引數或是返回值需要乙個"守衛"引用。它經常是通過返回或接受乙個指標來實現,這樣被認為是最佳的實現方式,那麼給乙個空指標就會造成麻煩(引用總是與物件相關聯的,而不會是乙個空的指標).

C FAQ閱讀筆記 2 引用

8.1 什麼是引用?乙個物件的別名 乙個替換的名字 叫引用 引用經常被用來做在函式引數的引用傳遞中 void swap int i,int j int main 這裡i和j是main是函式x和y的引用。換句話說,i就是x 不是說是x的乙個指標或說是x的拷貝,而是x本身,你對i做的一切都相當於直接對x...

C 學習筆記 2 引用 reference

3 引用作函式引數 4 引用 vs 指標的區別 參考資料 生活中很多人既有姓名也有外號,引用的概念類似於人的外號。引用變數是乙個別名,即某個已存在變數的另乙個名字。一旦把引用初始化為某個變數,就可以使用該引用名稱或變數名稱來指向變數。格式 型別名 引用名 目標變數名 分別對別名和原名賦值,二者會相互...

C 筆記1引用

include 標準命名空間 包含很多標準定義 using namespace std const double pi 3.14 圓class mycircle 獲取圓的面積 double gets void main 引用 void main 指標交換值 void swap1 int a,int ...