《c 入門經典》筆記12

2022-08-31 11:54:09 字數 3496 閱讀 8410

引用是乙個別名。建立引用時,使用另乙個物件(目標)的名稱來初始化它,從此以後該引用就像是目標的另乙個名稱,對引用執行的任何操作實際上針對的就是目標。

有些書上說引用就是指標,這不正確。雖然引用常常是使用指標實現的,但是只有編譯器開發人員關心這一點,作為程式設計師,必須區分這兩種概念。

指標是儲存另乙個物件的位址的變數,而引用時物件的別名。

要建立引用,需要指定目標物件的型別、引用運算子(&)和引用名。

程式清單12.1 reference.cpp

程式清單12.2 reference2.cpp

通常,使用引用時,不將位址運算子用於它,而像使用目標變數那樣使用引用。

程式清單12.3 assignment.cpp

因為物件也是一種變數,所以可引用任何物件,包括使用者定義的物件。可以像使用物件那樣使用物件的引用:訪問成員資料和成員函式時,使用類成員訪問運算子(.)與內建型別的引用一樣,指向物件的引用也是物件的別名。

指標未初始化或被刪除時,應將其賦為nullptr,但引用不一樣,引用不能為空,讓引用指向空物件的程式是非法的。

前面知道了函式的兩個侷限性:引數按值傳遞;return語句只能返回乙個值。

通過將值按引用傳遞給函式,可消除這兩種侷限性。在c++中,按引用傳遞時通過兩種方式完成的:使用指標和使用引用。他們的語法不同,但效果相同:不是在函式作用域內建立備份(也就是不是值拷貝),而是將原始物件傳遞給函式。

程式清單12.4 valuepasser.cpp

main()中的值都沒變,可見值拷貝並不能改變原參的值

使用指標實現swap()

程式清單12.5 pointerswap.cpp

#include void swap(int *x, int *y);

int main()

void swap(int *px, int *py)//引數宣告為指標

使用引用實現swap()

c++的目標之一時,避免函式的呼叫者操心函式的工作原理,而將注意力放在函式的功能和返回值上。傳遞指標將負擔轉嫁給了呼叫方,而這種負擔原本不應該由呼叫方來承擔:呼叫方必須知道將要交換的物件的位址傳入。

明白引用語法的負擔應由函式的實現方承擔。為此,可使用引用。

程式清單12.6 referenceswap.cpp

#include void swap(int &x, int &y);

int main()

void swap(int &rx, int &ry)//引數宣告為引用

可見兩種方式(指標傳位址、引用傳原參)達到的效果是一樣的,但是引用傳遞中,呼叫方只需傳遞變數,且在函式內部,需要使用的特殊符號減少了,降低了程式的複雜性。引用將常規變數方便而易於使用的特點和指標的強大融為一體。

函式原型的另乙個重要用途:通過檢視原型中宣告的引數(函式原型通常放在標頭檔案中),程式設計師知道swap()的引數是按指標還是引用傳遞的,從而將正確呼叫他們。

在c++中,類的使用者(其他類中使用該類的函式)依賴於標頭檔案來獲悉需要的所有資訊。標頭檔案相當於類或函式的介面,而實際實現對使用者是隱藏的。這讓程式設計師能夠將主要精力放在要解決的問題上,而使用類或函式時無需關心它是如何實現的。

(哦,這說和沒說是一樣的,還是只能return乙個東西)

一種解決辦法是將多個物件按引用傳入函式,然後在函式中將正確的值賦給這些物件。由於按引用傳遞讓函式能夠修改原始物件,因此這相當於讓函式能夠返回多項資訊。這種函式未使用函式的返回值,可將其(指返回值)用於報告錯誤。

另一種辦法是使用指標或引用來實現。

程式清單12.7 returnpointer.cpp

按引用返回值

雖然程式returnpointer.cpp可行,但是如果使用引用而不是指標,將更容易理解和維護。

程式清單12.8 returnreference.cpp

#include enum err_code//列舉

c 入門經典筆記

c 中的優先順序 命名空間概念 命名空間是一種邏輯上的劃分,而不是物理上的劃分。這種劃分方法有些類似於檔案的儲存方式。c 命名規範 1 類名,方法名和屬性名都用pascal命名法,即所有單詞連寫,每個單詞的第乙個字母大寫,其他字母小寫 2 變數名,一般物件名,控制項物件名和方法的引數名均用camel...

《c 入門經典》筆記2

組成電腦程式的指令稱為源 基於直譯器的語言每次讀取一行 並將指令進行轉換 基於編譯器的語言通過編譯將程式轉換為目標 這些 儲存在目標檔案中。然後,由鏈結器將目標檔案轉換為可在作業系統上執行的可執行程式。c 特點 快!面向過程 程式被設計為一系列操作,這些操作對一組資料進行處理。結構化程式設計主要思想...

C 入門1 2 繼承

class derivedclass baseclass 乙個類最多隻允許從乙個其他類派生 derivedclass還可以派生出更多的類。不需要也不能顯式指定繼承是公共 私有還是保護,因為c 的繼承都是公共的。派生類包含基類所有的方法和字段。在派生類中呼叫基類構造器來進行基類欄位的初始化。class...