C 學習筆記(六)

2021-07-25 09:01:53 字數 2939 閱讀 1925

函式

函式時乙個命名了的**塊,通過呼叫函式執行相應的**。可以有0個或多個引數,通常會產生乙個結果。

1.乙個典型的函式包含了四個部分:返回型別,函式名,形參列表以及函式體。

2.函式的呼叫完成兩項工作:一是用是引數(隱式的)初始化函式對應的形參,當呼叫乙個函式時,首先建立乙個同型別的變數a,然後將a初始化為呼叫時的實參;第二是將控制權從主調函式轉移給被調函式。

3.實參是形參的初始值,實參的型別必須和對應的形參型別匹配。

4.名字有作用域,物件有生命週期(該物件在程式執行過程中存在的一段時間)。形參和函式體內部定義的變數成為區域性變數,僅在函式的作用域內可見,同時區域性變數還會隱藏在外層作用域中同名的其它所有宣告。

5.自動物件:只存在於塊執行期間的物件。形參是一種自動物件。

區域性靜態物件:區域性變數的生命週期貫穿函式呼叫及之後的時間。在程式第一次經過物件定義語句時初始化,並且直到程式終止時才被銷毀,在此期間即使物件所在的函式結束執行也不會對它有影響。 只需要在定義變數之前加static即可。

6.如果形參是引用型別,他將繫結到隊形的實參上,稱它對應的實參被引用傳遞或函式被傳引用呼叫。 

如果形參不是引用型別,會將實參的值進行拷貝賦值給形參,稱實參被值傳遞或者函式被傳值引用。

7.通過使用引用形參,允許函式改變乙個或多個實參的值。如果函式無需改變引用形參的值,可以將其宣告為常量引用 const string &s1。建議盡量使用常量引用。

8.拷貝大的類型別物件或者容器物件比較低效,甚至有的類型別不支援拷貝操作,這時候只能通過引用形參訪問該型別的物件。

9.雖然說引用只能繫結到物件上,但有一種例外是當引用是常量引用是可以繫結到字面值和常量上,例如const int &a=42.

10.因為陣列操作中不允許拷貝以及使用陣列會轉換為指標操作,所以無法以值傳遞的形式來使用陣列引數,但是可以轉換為指標來進行操作,傳遞的是首元素的指標。

void print(const int* / int[ ])         .........  int j[2]=;    print(j);    

形參也可以是陣列的引用   void print (int (&a)[10])    a是具有10個整數的整型陣列的引用.

11.處理不同數量的實參,如果所有的實參型別相同,可以使用標準庫型別initializer_list,用於表示某種特定型別的值的陣列。定義在標頭檔案中。

12.return語句有兩種形式: return;   return expression;

無返回值的return語句只能用於返回型別是void的函式中,通常void函式想要在中間提前退出,可以使用return語句。

有返回值的return語句:只要函式的返回型別不是void,則必須有返回值。return語句返回值的型別必須與函式返回型別相同,或者能隱式的轉換成函式的返回型別。

值得注意的是:在含有return語句的迴圈後應該也有一條return語句。很容易忽視這個錯誤。

13.函式完成後,所占用的儲存空間也隨之被釋放,因此函式終止意味著區域性變數的引用將指向不再有效的記憶體區域。

14.如果同一作用域內的幾個函式名相同但形參列表不同,稱之為過載函式。main函式不能過載

15.對於過載函式來說,應該在形參數量或形參型別上有所不同;不允許兩個函式除了返回型別以外其他所有的要素都相同。

16.函式匹配是指乙個過程,在這個過程中把函式呼叫與一組過載函式中的某乙個關聯起來。當呼叫過載函式會有三種結果:最佳匹配、無匹配和二義性呼叫。

如果在內層作用域中宣告名字,它將隱藏外層作用域中宣告的同名實體。在不同的作用域中無法過載函式名。

一旦當前作用域中找到了所需的函式名,編譯器就會忽略掉外層作用域中的同名實體。

名字查詢發生在型別檢查之前。

17.預設實參:在函式每次呼叫時某個形參都被賦予了乙個相同的值,這個值就是預設實參。呼叫含有預設實參的函式時,可以包含該實參,也可以省略。

一旦某個形參被賦予了預設值,他後面的所有形參都必須有預設值。

18.呼叫函式一般比求等價表示式要慢一點,可以將函式指定為內聯函式避免呼叫的開銷。在函式返回型別之前加inline。

19.constepr函式指能用於常量表示式的函式,要求返回型別和所有形參的型別都得是字面值型別,而且函式體內有且只有一條return語句。constexpr被隱式的指定為內聯函式。

20.預處理功能assert和ndebug。程式可能包含一些用於除錯的**,但在程式發布時需要遮蔽這些**。此時可以用到與處理功能。

assert是一種預處理巨集,或者說是乙個預處理變數。使用表示式作為條件  assert(expr);   首先對expr求值,若為假0則輸出資訊並終止程式,若為真(非0)則什麼都不做。

assert常用於檢查「不能發生」的條件。

assert依賴於ndebug的預處理變數的狀態。如果定義了ndebug,則assert什麼都不做,預設狀態下沒有定義ndebug,此時assert將執行執行並檢查。

ndebug除了用於assert以外,可以自己的條件除錯**,如果ndebug未定義,將執行#ifndef和#endif之間的**。如果定義了ndebug,這些**將被忽略掉。

21.函式匹配第一步是選定本次呼叫對應的過載函式集,集合中的函式稱為候選函式。候選函式有兩個特徵:預被呼叫函式同名;其宣告在呼叫點可見。

第二步考察本次呼叫提供的實參,然後從候選函式中選出能被這組實參呼叫的函式,這些新選出的函式稱為可行函式。可行函式有兩個特徵:形參數量與本次呼叫的實參數量相等;每個實參與對應的形參型別相同或者可以轉換。

如果函式含有預設實參,則在呼叫該函式時傳入的實參數量可能少於實際的實參數量。 

第三步從可行函式中選擇與本次呼叫最匹配的函式。基本思想是實參型別與形參型別最接近匹配的越好。

如果(42,12.4) 可以呼叫f(int,int) ,也可以呼叫f(double,double),此時這個呼叫會因為具有二義性而拒絕,從而出現錯誤。

22.函式指標指向的是函式而非物件,函式指標指向某種特定型別,想要宣告乙個可以指向該函式的指標,只需要用指標替換函式名即可。int (*p)(.........)

c 學習筆記六

指標 可以使用指標記號操作儲存在陣列中的資料 可以在函式中訪問函式外部的大塊資料 動態為新變數分配空間 1 指標的宣告 long pnumber 2 位址運算子 例如 long number 1234l long pnumber pnumber number 3 間接運算子 4 指標的初始化 可以用...

C 學習筆記六

標準庫的棧 佇列 雙向佇列 io庫的條件狀態 輸出緩衝區的管理 使用的標頭檔案 include 是乙個容器 使用的方法 標準庫的棧是基於陣列的 和棧類似。使用標頭檔案 include 優化了的雙向佇列,向兩端插入刪除開銷小,支援操作符,但是效能比vector差,占用更多記憶體 使用標頭檔案 incl...

c 學習筆記 六 委託

委託是一種引用方法的型別.一旦為委託分配了方法,該委託與方法具有相同的型別,委託象其他方法一樣具有返回值和引數.如 public delegate int mydelegate int x int y 與該委託簽名相匹配的方法可以分配給該委託.delegate關鍵字用於宣告乙個引用型別,通常委託用於...