在上一節,我們已經學會了如何閱讀函式原型和如何呼叫乙個函式。然而,僅靠系統給出的標準庫函式是不夠用的。我們有時候要根據我們的實際要求,寫出乙個合適自己使用的函式。
那麼,我們如何來自己動手編寫乙個函式呢?
首先,我們要告訴電腦,我們自己編寫了乙個函式,即這個函式是存在的,這叫作函式的宣告(declaration)。其次,我們要告訴電腦這個函式是怎麼運作的,這叫作函式的定義(definition)。顯然,函式的宣告和函式的定義是兩個不同的概念。宣告表示該函式存在,而定義則是表示該函式怎麼去執行。
我們平時做事都是要有先後順序的,如果把次序顛倒了可能會惹些麻煩出來。編寫函式的時候也一樣。我們必須在呼叫乙個函式之前就告訴電腦這個函式已經存在了,否則就成了「馬後炮」。所以,我們一般把函式的宣告放在主函式前面。
在c++中,函式原型就是函式的宣告。所以,函式原型除了向使用者說明如何使用乙個函式以外,還告訴電腦存在這樣乙個可以使用的函式。
我們已經介紹了函式原型的結構,只不過「產生結果型別」這個名稱是為了方便理解而起的。它應該稱為「返回值型別」,用任意一種資料型別來表示,比如int或者char等等,當然還包括空型別void。多個引數則構成了「參數列」,表示執行這個函式需要哪些資料。於是,函式原型的結構就是:
返回值型別函式名(參數列);
函式宣告同變數的宣告一樣,是一句語句。所以在語句結束要加上分號。函式名、引數名的規則和注意事項同變數名一樣。
關於「返回」的概念稍後再作介紹,我們先來說說參數列。我們知道,在宣告函式的時候,會寫一些引數,而在呼叫函式的時候需要一一對應地填入這些引數。雖然它們都叫引數,但在不同的情況下,它們的含義是不同的。在宣告乙個函式的時候,引數是沒有實際值的,只是起到乙個佔位的作用,所以稱為形式引數,簡稱「形參」;在呼叫乙個函式的時候,引數必須有乙個確定的值,是真正能夠對結果起作用的因素,所以稱為實際引數,簡稱「實參」。我們拿數學中的函式作為例子,g(x,y)=x/4+y中的x和y就是形式引數,而g(4,1)=4/4+1=2中的4和1就是實際引數;如果令a=4、b=1,那麼g(a,b)中的a和b也是實際引數。
說完了函式的宣告,我們來說函式的定義。其實函式的定義對大家來說是比較熟悉的。因為我們之前所寫的程式都是對主函式的定義。函式定義的格式為:
沒有分號結尾的函式原型
我們把函式定義中沒有分號結尾的函式原型稱為函式頭,把之後的語句塊稱為函式體。任何乙個函式的定義不能出現在另乙個函式體內。但函式體內可以呼叫任何乙個函式,包括其本身。
下面我們先來看乙個例子,你就會對函式定義有些了解了。(程式6.2.1)
執行結果:
5程式在執行的時候從main函式開始,遇到呼叫乙個使用者定義的函式max,則去查詢這個max函式的定義,然後執行max函式。執行完了以後,回到呼叫max函式的地方,繼續後面的語句,直到程式結束。所以整個程式的執行過程如箭頭所示。
如果在乙個班級裡有兩個同名同姓的同學,那麼老師上課點名將是件麻煩事。因為大家都搞不清到底是在叫誰。可是,如果兩個不同的班級有兩個同名同姓的同學,就不會發生這種尷尬,因為老師在不同的教室點相同的名字,會有反應的只有乙個同學。
我們把這個問題套用到函式上來。如果在同乙個函式有兩個名字相同的變數,那麼電腦將無法分清到底要使用哪個變數,導致錯誤發生。而在不同的函式中,即使有相同名稱的變數,由於在某乙個函式中該變數的名稱是唯一的,電腦也能方便的識別要使用哪個變數。因此,我們得到這樣乙個結論:一般情況下,在同乙個函式中,不能有名稱相同的變數或引數;在兩個不同的函式中,可以有名稱相同的變數或引數。
下面就讓我們來看乙個例項:(程式6.2.2)
#include "iostream.h"
int max(int a,int b,int c);//求三個整數的最大者
int min(int a,int b,int c);//求三個整數的最小者
void output(int a);//輸出功能
int main()
int max(int a,int b,int c)//不在同乙個函式中,引數名重複沒關係
int min(int a,int b,int c)
void output(int a)
執行結果:42
要注意,一旦函式執行結束,那麼該函式中宣告的引數和變數都將消失。就像下課了,同學們都回家了,老師叫誰都是叫不應的。
C 虛函式的宣告和定義
多型 polymorphism 是物件導向程式設計最重要的特性之一。c 通過結合虛函式和指標 引用 來實現多型。作為 c 使用者,你當然知道如何將虛函式和指標 引用 結合起來以實現多型。但在這些概念之間,可能還存在些許模糊地細節問題。根據 c 標準,虛成員函式應在類內定義宣告,且必須有定義 實現 注...
C 變數和函式的宣告和定義
有一部分c 程式設計師對於多個原始檔一起編譯鏈結時,變數,函式或者類宣告和實現到底如何定義模糊不清,現在分類澄清一下。變數 variable 在c 中,變數宣告 declaration 只有在使用extern關鍵字時才成立,其他情況下都是定義 definition 而在使用extern的同時給變數賦...
C 變數和函式的宣告和定義
有一部分c 程式設計師對於多個原始檔一起編譯鏈結時,變數,函式或者類宣告和實現到底如何定義模糊不清,現在分類澄清一下。變數 variable 在c 中,變數宣告 declaration 只有在使用extern關鍵字時才成立,其他情況下都是定義 definition 而在使用extern的同時給變數賦...