所謂的函式 ( Function ) 就是 『 敘述的集合 』 ,並且以一個函數名稱來代表此敘述集合。 通常一個函式可以完成某項功能,所以我們可以把函式想成是一種對資料的操作方法,它和算符在本質上是一樣的,只不過是用不同的方式來表達而已。

整個 C++ 程式就是由各個函式所構成的,每個函式都是一個完整的單元,由固定的入口進,由簡單的出口出,所以其內部的資料及運算過程可以做最佳的封裝。 函式的入口即函式的開頭,出口則是函式的結尾或 retuen 之處,這種特性使得函式的行為容易掌握,所設計出來的程式就更強固耐用 ( robust ) 了。

整體來說,C++ 的函式具有下列的特性:

✦ 函式的行為由定義函式的敘述所決定,其呼叫、傳遞參數、接受傳回值的方式一定要依照定義的規範行使。

✦ 參數的傳遞方式有傳值 ( Pass by value )、傳址 ( Pass by address ) 和傳參考 ( Pass by reference ) 三種。

✦ 函式的定義可以獨立寫成一個原始檔,並個別編譯后再整體聯結在一起。 因此一個函式定義可供多個程式或不同的使用者來聯結使用。

✦ 使用函式可以讓程式更具結構化、更能相互支援、也更容易除錯及維護,並可達到功能獨立、資訊隱藏的目的。

☛ 函式的定義、宣告與呼叫方式

函式的定義方式:

型别    函式名稱 ( 型别  參數1 , 型别  參數2 , ... )
{                                                  //函式内容
        敘述的集合 ...
        ......
}

範例

int max(int a, int b)
{
    return(a>b?a:b);
}

函式的宣告方式:

型别 函式名稱 ( 型别 參數1 , 型别 參數2 , ... );

【註】 參數1、參數2、 ... 均可省略,但各型別則不可省。

範例

int max(int a, int b );

或

int max(int, int);

函式的呼叫方式:

函式名稱 ( 參數1, 參數2, ... )

【註】 若函式有傳回值,則可將此傳回值存入變數中,或用來參與其他的運算。

範例

i = max(5,b);
j = i + max(i,j) * 3;

 

函式的定義本身也具有宣告的功能,任何的函式在呼叫之前都必須先宣告過,否則會產生 compile-time 的錯誤。 一般都會將函式的宣告 ( 一般稱為『原型宣告』,Prototype ) 放在表頭檔之中,那麼在不同的程式檔中只要 include 這個表頭檔,就可以直接使用函式而不必另外再宣告一次。 Prototype 在同一個檔案內可以宣告多次而不會有任何不良的影響。

在宣告函式時,參數列中的參數名稱可有可無,通常會取一些比較有意義的名稱來增加可讀性,例如:

print(int size, char *array);

上例若寫成 print(int, char); ,則很難瞭解各參數的作用。 通常都會直接將函式定義的第一行 copy 一份來作為宣告之用,然後再最後面加上一個分號。 若沒有指明函式傳回值的型別,則預設為整數。

在函式的定義或宣告中,參數列內的各參數是用來接受傳入資料的,稱為『形式參數』( Formal arguments ),而在呼叫函式時實際傳過去的參數,稱為『實際參數』( Actual arguments )。

在呼叫函式時,C++ 會嚴格地檢查各實際參數及傳回值是否和宣告的樣子一致 ( Strong type checking ),若參數的數目不相符,則會立刻產生 compile-time 的錯誤。 如果只是型別的不一致,則 compiler 會嘗試做自動型別轉換,將傳入的實際參數轉換成形式參數的型別;只有在轉換失敗時才會產生錯誤。

int max(int a, int b)
{
    return (a>b?a:b);
}

void main()
{
     int ans,*p;
     long lan;
     ans = max(3.2, 5.1);     //轉成 max(3,5),結果為 5
     ans = max('a', 700000L); //轉成 max(97, ?),結果可能有誤,700000L 在轉換時有資料喪失
     lan = max(3, 4);         //傳回 4 再轉為 long 存入 lan
     ans = max(3);            //錯誤:參數數目不對
     ans = max("abc",5);      //錯誤:"abc" 無法轉為 int 型別
}

函式的定義是各自獨立的,不能在函式的內容再定義函式。 整個 C++ 程式就是一個個的函式定義所組成的,main() 本身也是一個函式,當程式執行時,系統首先將控制權交給 main() 函式,而 main() 則依照所定義的內容 ( 即所寫的程式內容 ) 去執行。 當 main() 呼叫別的函式時,則把控制權交給該函式,而被呼叫的函式也是依定義的內容去執行,一直到函式結束為止,再將控制權轉移回原呼叫之處。

函式的參數傳遞,可包括傳入的參數列和傳出的傳回值,稱之為『公用介面』( Public interface )。 一個好的函式設計,應該只使用公用介面來與外界溝通,這樣做的好處是當函式需要修改時,只要公用介面不變,就不會影響到其他的函式運作。