C Primer 第6章 函式 學習筆記

2022-09-02 22:24:24 字數 2942 閱讀 6035

1.      編寫+呼叫函式

a)      乙個典型的函式定義包括以下部分:返回型別、函式名字、由0個或多個形參組成的列表以及函式體。

b)      我們通過呼叫運算子執行函式,它作用於乙個表示式,該表示式是函式或者指向函式的指標。呼叫表示式的型別就是函式的返回型別

c)      函式的呼叫完成兩項工作:一是用實參初始化函式對應的形參,二是將控制權轉移給被呼叫函式

d)      return語句也完成兩項工作:一是返回return語句中的值,二是將控制權從被調函式轉移回主調函式

int fact(int val)

2.      形參和實參

a)      實參是形參的初始值。第乙個實參初始化第乙個形參,第二個實參初始化第二個形參,以此類推

b)      實參的型別必須與對應的形參型別匹配;且函式有幾個形參,我們必須提供相同數量的實參

c)      void返回型別表示函式不返回任何值

d)      函式的返回型別不能陣列型別或函式型別,但可以是指向陣列或函式的指標

3.      區域性物件

a)      形參和函式體內部定義的變數統稱為區域性變數,僅在函式的作用域內可見

b)      對於普通區域性變數對應的物件來說,當函式的控制路徑經過變數定義語句時建立該物件,當到達定義所在的塊的末尾時銷毀它

c)自動物件是指只存在於塊執行期間的物件,形參是一種自動物件:函式開始時為形參申請儲存空間,一旦函式終止,形參被銷毀

d)區域性靜態物件在程式的執行路徑第一次經過物件定義語句時初始化,直到程式終止才被銷毀,在此期間即使物件所在的函式結束執行也不會對它有影響。可以將區域性變數定義成static型別獲得這樣的物件

#include using namespace std;

size_t count_calls()

int main()

int main()

int main()

} return ret; //出現次數通過occurs隱式地返回

}//給函式傳入乙個額外的引用實參儲存字元出現的次數

8.      陣列形參

a)      不允許拷貝陣列(3.5.1節,102頁),且使用陣列時(通常)會將其轉換成指標(3.5.3,105頁)

b)      因為陣列會被轉換成指標,所以當我們為函式傳遞乙個陣列時,實際上傳遞的是指向陣列首元素的指標

void print(const int*);

void print(const int);

void print(const int[10]);

//這三個函式是等價的,每個函式的唯一形參都是const int*型別

c)      管理陣列實參有三種常用的方法:

1)      使用標記指定陣列長度:要求陣列本身包含乙個結束標記,使用這種方法的典型示例是c風格字串。c風格字串儲存在字元陣列中,並且在最後乙個字元後面跟著乙個空字元。函式在處理c風格字串時遇到空字元停止

2)      使用標準庫規範:傳遞指向陣列首元素尾後元素指標

void print(const int *beg, const int *end)

3)      乙個返回型別是void的函式也能使用return語句的第二種形式,但語句的expression必須是另乙個返回void的函式

b)      有返回值函式

1)      只要函式的返回型別不是void,則該函式內的每條return語句必須返回乙個值

2)      return語句返回值的型別必須與函式的返回型別相同,或者能隱式地轉換成函式的返回型別

c)      不要返回區域性物件的引用或指標,因為函式終止意味著區域性變數的引用將指向不再有效的記憶體區域

10.      函式過載

a)      如果同一作用域內的幾個函式名字相同但形參列表不同,我們稱之為過載函式

b)      這些函式接受的形參型別不一樣,但執行的操作非常類似。呼叫這些函式時,編譯器會根據傳遞的實參型別推斷想要的是哪個函式

c)      對於過載的函式來說,它們應該在形參數量或形參型別上有所不同

d)      不允許兩個函式除了返回型別外其他所有的要素都相同

11.      呼叫過載的函式

a)      在函式匹配過程當中,我們把函式呼叫與一組過載函式中的某乙個關聯起來。編譯器首先將呼叫的實參與過載集合中每乙個函式的形參進行比較,然後根據比較的結果決定到底呼叫哪個函式

b)      當呼叫過載函式時有三種可能的結果:

1)      編譯器找到乙個與實參最佳匹配的函式,並生成呼叫該函式的**

2)      找不到任何乙個函式與呼叫的實參匹配,編譯器發出無匹配的錯誤資訊

3)      有多於乙個函式可以匹配,但是每乙個都不是明顯的最佳選擇,發生錯誤,成為二義性呼叫

12.      assert預處理巨集

a)      可以有選擇地執行除錯**

b)      預處理巨集其實是乙個預處理變數

c)      assert巨集使用乙個表示式作為它的條件:assert(expr); 首先對expr求值。如果expr為假(0),assert輸出資訊並終止程式的執行。如果為真,assert什麼也不做

d)      assert巨集定義在cassert標頭檔案中

e)      含有cassert標頭檔案的程式不能再定義名為assert的變數、函式或者其他實體

《C Primer》讀書筆記 第6章 函式

傳引用呼叫 void resrt int i int j 42 reset j j採用傳引用呼叫,他的值被改變 cout j endl 輸出0 陣列形參 void print const int a void print const int a void print const int a 10 儘...

《Lua程式設計》第6章 深入函式 學習筆記

在lua中,函式是一種 第一類值 first class value 它們具有特定的詞法域 lexical scoping 詞法域 函式可以潛逃在另乙個函式中,內部的函式可以訪問外部函式中的變數。它允許lua在應用各種函式式語言 functional language 中的強大程式設計技術。lua中...

第 6章 函式

6.1.2引數 2.引數陣列 c 允許為函式指定乙個 只能乙個 特殊的引數,這個引數必須是函式定義中的最後乙個引數,可用params關鍵字定義他們 如 params int vals 3.引用引數和值引數 理解 將本來在函式中引數按值引用的規則改變成按傳遞引用,使得這個引數會改變,定義引數和傳遞引數...