1. 程式人生 > >第三章 函式

第三章 函式

**3.1函式的定義與呼叫:
3.1.1函式定義
函式是程式程式碼的一個自包含單元,用於完成某一特
定的任務。
有的函式完成某一操作;
有的函式計算出一個值。 通常,一個函式即能完成某一特定操作,又能計算數值。
為什麼要定義函式
避免重複的程式設計。
使程式更加模組化,便於閱讀、修改。
一個程式必須有且只有一個main( )函式,C++從main( ) 函式開始執行。
C++語言中,所有函式都是平行獨立的,無主次、相 互包含之分。函式可以巢狀呼叫,不可巢狀定義。
從使用者使用的角度看,函式有兩種:
(1) 系統函式,即庫函式。這是由編譯系統提供的,使用者不必自己定義這些函式,可以直接使用他們。
(2) 使用者自己定義的函式

。用以解決使用者的專門需要。
從函式的形式看,函式分兩類:
(1) 無參函式。呼叫函式時不必給出引數。
(2) 有參函式。在呼叫函式時,要給出引數。在主調函式
和被呼叫函式之間有資料傳遞。
引數是函式與外部傳輸資料的紐帶。若函式的定義省略引數表,則稱為無參函式;否則為有參函式。
無參函式表示函式不依賴外部資料,執行獨立操作。
庫函式是C++編譯系統已預定義的函式,使用者根據需要可以
直接使用這類函式。庫函式也稱為標準函式。
•C++把一些常用函式作為庫函式提供給使用者,使用者可以直
接使用系統提供的庫函式:
•數學計算函式(如sqrt()、pow(),fabs(),exp()等, cmath)
•字串處理函式(string)
•標準輸入輸出函式等(iostream),
•使用者使用任一庫函式時,直接使用,不用定義,但在程式
中必須包含相應的標頭檔案。
如 #include等。

函式的返回值:(轉載以及個人補充)

函式的返回值通過return語句獲得。函式只能有唯一的
返回值。
函式返回值的型別就是函式的型別。
return語句可以是一個表示式,函式先計算表示式後再返
回值。
return語句還可以終止函式,並將控制返回到主調函式。
return 語句之後的程式碼是不能執行的程式碼。
一個函式中可以有一個以上的return語句,執行到哪一
個return語句,哪一個語句起作用。
既然函式有返回值,這個值當然應屬於某一個確定的型別,
應當在定義函式時指定函式值的型別。
int max (float a, float b) // 函式值為整型。
函式返回值的型別,也是函式的型別。
不帶返回值的函式可說明為void型。
函式的型別與函式引數的型別沒有關係。
double blink ( int a, int b)
如果函式的型別和return表示式中的型別不一致,則以
函式的型別為準。函式的型別決定返回值的型別。對數值
型資料,可以自動進行型別轉換。
函式的返回主要分為以下幾種情況

1、主函式main的返回值:

允許主函式main沒有返回值就可結束;可將主函式main返回的值視為狀態指示器,返回0表示程式執行成功,其他大部分返回值則表示失敗。

2、返回非引用型別:

函式的返回值用於初始化在呼叫函式時建立的臨時物件(temporary object),如果返回型別不是引用,在呼叫函式的地方會將函式返回值複製給臨時物件。
在求解表示式的時候,如果需要一個地方儲存其運算結果,編譯器會建立一個沒命名的物件,這就是臨時物件。C++程式設計師通常用temporary這個術語來代替temporary object。
用函式返回值初始化臨時物件與用實參初始化形參的方法是一樣的。
當函式返回非引用型別時,其返回值既可以是區域性物件,也可以是求解表示式的結果。
3、返回引用型別:

當函式返回引用型別時,沒有複製返回值,相反,返回的是物件本身。
千萬不要返回區域性物件的引用!千萬不要返回指向區域性物件的指標!
當函式執行完畢時,將釋放分配給區域性物件的儲存空間。此時對區域性物件的引用就會指向不確定的記憶體!返回指向區域性物件的指標也是一樣的,當函式結束時,區域性物件被釋放,返回的指標就變成了不再存在的物件的懸垂指標。

返回引用時,要求在函式的引數中,包含有以引用方式或指標方式存在的,需要被返回的引數。///

*3.1.2函式呼叫:
函式的呼叫要做兩件事情:指定函式地址,提供實際引數。函式名是函式的地址,實際引數提供被呼叫函式執行任務所需要的資訊及接受被呼叫函式返回的資訊。

在這裡插入圖片描述
在這裡插入圖片描述
在定義函式時 形式引數和實際引數 函式名後面括號中的變數名稱為
形式引數(formal parameter,簡稱形參)。
形參是被調函式中的變數;
在主調函式中呼叫一個函式時,函式名後面括
號中的引數(可以是一個表示式)稱為實際引數
(actual parameter,簡稱實參)。
實參是主調函式賦給被調函式的特定值。
實參可以是常量、變數或複雜的表示式,不管是哪
種情況,在呼叫時實參必須是一個確定的值。
按函式在語句中的作用來分,可以有以下3種函式呼叫方式
1. 函式語句
把函式呼叫單獨作為一個語句,並不要求函式帶回一個值,
只是要求函式完成一定的操作。printstar();
2. 函式表示式
函數出現在一個表示式中,這時要求函式帶回一個確定的
值以參加表示式的運算。如c=2*max(a,b);
3. 函式引數
函式呼叫作為一個函式的實參。如
m=max(a,max(b,c));
在一個函式中呼叫另一個函式需要具備條件:
(1) 首先被呼叫的函式必須是已經存在的函式。
(2) 如果使用庫函式,應用#include命令將有關標頭檔案
"包含"到本檔案中來。
(3) 如果使用使用者自定義的函式,函式呼叫遵循先定義、
後呼叫的原則,即
被調函式應出現在主調函式之前;
如果被呼叫函數出現在主調函式之後,則函式必須在主調函式
之前進行宣告。

幾點說明:

① 在函式呼叫前,形參並不佔記憶體的儲存單元,只有在函
數開始呼叫時,形參才被分配記憶體單元。呼叫結束後,形
參所佔用的記憶體單元被釋放。
②實參可以是常量、變數或表示式,但要求有確定的值。
③實參變數對形參變數的資料傳遞是"值傳遞",即單向傳
遞,只由實參傳給形參,而不能由形參傳回來給實參。在
記憶體中實參、形參分佔不同的單元。
實參與形參一一對應,型別應相同或賦值相容。
說明:
④不同的函式中可以使用相同的變數名和形參名,他們是
不同的變數。

3.1.3函式原型
函式原型是函式的宣告,作用是告訴編譯器有關函數借口的資訊:函式的名字、函式返回值的資料型別、函式引數的個數、引數型別和引數性質。

3.2函式呼叫機制**
*3.3.1巢狀呼叫:
在這裡插入圖片描述

3.3.2遞迴呼叫*
在這裡插入圖片描述