在程序中出現(xiàn)函數(shù)名時(shí),要注意區(qū)分以下三種情況:
鳳慶網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái)到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
1. main函數(shù)中的int?max(int?x,int?y);?是函數(shù)的聲明,一般格式為?返回值?函數(shù)名(參數(shù)類型?參數(shù));
2. max(a,b)為函數(shù)的調(diào)用,一般格式為?函數(shù)名(參數(shù));
3. 后面的max(int?x,int?y){?...}是函數(shù)的定義,一般格式為?返回值?函數(shù)名(參數(shù)類型?參數(shù)){函數(shù)體}
c語(yǔ)言規(guī)定,在一個(gè)函數(shù)定義之前調(diào)用它,需要提前進(jìn)行聲明。
原因是,如果沒(méi)有聲明函數(shù),當(dāng)程序運(yùn)行到max(a,b)時(shí),由于后面的函數(shù)定義還沒(méi)有被讀到,所以計(jì)算機(jī)并不知道m(xù)ax是個(gè)什么東西,程序就會(huì)出錯(cuò)。
如果將函數(shù)定義提到main函數(shù)的前面,就無(wú)需進(jìn)行聲明了,程序也不會(huì)報(bào)錯(cuò)。
一個(gè)函數(shù)由兩部分組成:①函數(shù)的首部,包括函數(shù)名、函數(shù)類型、函數(shù)屬性、函數(shù)參數(shù)(形式參數(shù))名、參數(shù)類型。②函數(shù)體,即函數(shù)首部下面的花括號(hào)內(nèi)的部分。函數(shù)體一般包括兩部分:聲明部分、執(zhí)行部分。
在一個(gè)函數(shù)定義中,函數(shù)體之前的所有部分稱為函數(shù)頭,它給出了該函數(shù)的返回類型、每個(gè)參數(shù)的次序和類型等函數(shù)原型信息,所以當(dāng)沒(méi)有專門給出函數(shù)原型說(shuō)明語(yǔ)句時(shí),系統(tǒng)就從函數(shù)頭中獲取函數(shù)原型信息。
一個(gè)函數(shù)的原型語(yǔ)句就是其函數(shù)頭的一個(gè)拷貝,當(dāng)然要在最后加上語(yǔ)句接上結(jié)束符分號(hào)。函數(shù)原型語(yǔ)句與函數(shù)頭也有細(xì)微的差別,在函數(shù)原型語(yǔ)句中,其參數(shù)表中的每個(gè)參數(shù)允許只保留參數(shù)類型,而省略參數(shù)名,并且若使用參數(shù)名也允許與函數(shù)頭中對(duì)應(yīng)的參數(shù)名不同。
全文如下:
一)、定義格式
類型名 函數(shù)名 ([參數(shù)表]) 函數(shù)體
類型名為系統(tǒng)或用戶已定義的一種數(shù)據(jù)類型,它是函數(shù)執(zhí)行過(guò)程中通過(guò)return語(yǔ)句要求返回的值的類型,又稱為該函數(shù)的類型。當(dāng)一個(gè)函數(shù)不需要通過(guò)return語(yǔ)句返回一個(gè)值時(shí),稱為無(wú)返回值函數(shù)或無(wú)類型函數(shù),此時(shí)需要使用保留字void作為類型名。當(dāng)類型名為int時(shí),可以省略不寫,但為了清楚起見,還是寫明為好。
函數(shù)名是用戶為函數(shù)所起的名字,它是一個(gè)標(biāo)識(shí)符,應(yīng)符合C++標(biāo)識(shí)符的一般命名規(guī)則,用戶通過(guò)使用這個(gè)函數(shù)名和實(shí)參表可以調(diào)用該函數(shù)。
參數(shù)表又稱形式參數(shù)表,它包含有任意多個(gè)(含0個(gè),即沒(méi)有)參數(shù)說(shuō)明項(xiàng),當(dāng)多于一個(gè)時(shí)其前后兩個(gè)參數(shù)說(shuō)明項(xiàng)之間必須用逗號(hào)分開。每個(gè)參數(shù)說(shuō)明項(xiàng)由一種已定義的數(shù)據(jù)類型和一個(gè)變量標(biāo)識(shí)符組成,該變量標(biāo)識(shí)符成為該函數(shù)的形式參數(shù),簡(jiǎn)稱形參,形參前面給出的數(shù)據(jù)類型稱為該形參的類型。一個(gè)函數(shù)定義中的參數(shù)表可以被省略,表明該函數(shù)為無(wú)參函數(shù),若參數(shù)表用void取代,則也表明是無(wú)參函數(shù),若參數(shù)表不為空,同時(shí)又不是保留字void,則稱為帶參函數(shù)。
函數(shù)體是一條復(fù)合語(yǔ)句,它以左花括號(hào)開始,到右花括號(hào)結(jié)束,中間為一條或若干條C++語(yǔ)句。
在一個(gè)函數(shù)的參數(shù)表中,每個(gè)參數(shù)可以為任一種數(shù)據(jù)類型,包括普通類型、指針類型、數(shù)組類型、引用類型等,一個(gè)函數(shù)的返回值可以是除數(shù)組類型之外的任何類型,包括普通類型、指針類型和引用類型等。另外,當(dāng)不需要返回值時(shí),應(yīng)把函數(shù)定義為void類型。
二)、定義格式舉例
(1) void f1() {...}
(2) void f2(int x) {...}
(3) int f3(int x,int* p) {...}
(4) char* f4(char a[]){...}
(5) int f5(int x,double d) {...}
(6) int f6(int b[10], int n) {...}
(7) void f7(float c[][N], int m, float max) {...}
(8) bool f8(ElemType* bt, ElemType item) {...}
在第一條函數(shù)定義中,函數(shù)名為f1,函數(shù)類型為void,參數(shù)表為空,此函數(shù)是一個(gè)無(wú)參無(wú)類型函數(shù)。若在f1后面的圓括號(hào)內(nèi)寫入保留字void,也表示為無(wú)參函數(shù)。
在第二條函數(shù)定義中,僅帶有一個(gè)類型為int的形參變量x,該函數(shù)沒(méi)有返回值。
在第三條函數(shù)定義中,函數(shù)名為f3,函數(shù)類型為int,函數(shù)參數(shù)為x和p,其中x為int型普通參數(shù),p為int*型指針參數(shù)。
在第四條函數(shù)定義中,函數(shù)名為f4,函數(shù)類型為char*,即字符指針類型,參數(shù)表中包含一個(gè)一維字符數(shù)組參數(shù)。注意:在定義任何類型的一維數(shù)組參數(shù)時(shí),不需要給出維的尺寸,當(dāng)然給出也是允許的,但沒(méi)有任何意義。
在第五條函數(shù)定義中,函數(shù)名為f5,返回類型為int,該函數(shù)帶有兩個(gè)形參,一個(gè)為 整型引用變量x,另一個(gè)為雙精度變量d。
在第六條函數(shù)定義中,函數(shù)名為f6,函數(shù)類型為int,即整型引用,該函數(shù)帶有兩個(gè)形參,一個(gè)是整型數(shù)組b,另一個(gè)是整型變量n。在這里定義形參數(shù)組b所給出的維的尺寸10可以被省略。
在第七條函數(shù)定義中,函數(shù)名為f7,無(wú)函數(shù)類型,參數(shù)表中包含三個(gè)參數(shù),一個(gè)為二維單精度型數(shù)組c,第二個(gè)為整型變量m,第三個(gè)為單精度引用變量max。注意:當(dāng)定義一個(gè)二維數(shù)組參數(shù)時(shí),第二維的尺寸必須給出,并且必須是一個(gè)常量表達(dá)式,第一維尺寸可給出也可不給出,其作用相同。
在第八條函數(shù)定義中,函數(shù)名為f8,返回類型為bool,即邏輯類型,該函數(shù)帶有兩個(gè)參數(shù),一個(gè)為形參bt,它為ElemType的指針引用類型,另一個(gè)為形參item,它是ElemType的引用類型,其中ElemType為一種用戶定義的類型或是通過(guò)typedef語(yǔ)句定義的一個(gè)類型的別名。
三)、有關(guān)函數(shù)定義的幾點(diǎn)說(shuō)明
1. 函數(shù)原型語(yǔ)句
在一個(gè)函數(shù)定義中,函數(shù)體之前的所有部分稱為函數(shù)頭,它給出了該函數(shù)的返回類型、每個(gè)參數(shù)的次序和類型等函數(shù)原型信息,所以當(dāng)沒(méi)有專門給出函數(shù)原型說(shuō)明語(yǔ)句時(shí),系統(tǒng)就從函數(shù)頭中獲取函數(shù)原型信息。
一個(gè)函數(shù)必須先定義或聲明而后才能被調(diào)用,否則編譯程序無(wú)法判斷該調(diào)用的正確性。一個(gè)函數(shù)的聲明是通過(guò)使用一條函數(shù)原型語(yǔ)句實(shí)現(xiàn)的,當(dāng)然使用多條相同的原型語(yǔ)句聲明同一個(gè)函數(shù)雖然多余但也是允許的,編譯時(shí)不會(huì)出現(xiàn)錯(cuò)誤。
在一個(gè)完整的程序中,函數(shù)的定義和函數(shù)的調(diào)用可以在同一個(gè)程序文件中,也可以處在不同的程序文件中,但必須確保函數(shù)原型語(yǔ)句與函數(shù)調(diào)用表達(dá)式出現(xiàn)在同一個(gè)文件中,并且函數(shù)原型語(yǔ)句出現(xiàn)在前,函數(shù)的調(diào)用出現(xiàn)在后。
通常把一個(gè)程序中用戶定義的所有函數(shù)的原型語(yǔ)句組織在一起,構(gòu)成一個(gè)頭文件,讓該程序中所含的每個(gè)程序文件的開始(即所有函數(shù)定義之前)包含這個(gè)頭文件(通過(guò)#include命令實(shí)現(xiàn)),這樣不管每個(gè)函數(shù)的定義在哪里出現(xiàn),都能夠確保函數(shù)先聲明后使用(即調(diào)用)這一原則的實(shí)現(xiàn)。
一個(gè)函數(shù)的原型語(yǔ)句就是其函數(shù)頭的一個(gè)拷貝,當(dāng)然要在最后加上語(yǔ)句接上結(jié)束符分號(hào)。函數(shù)原型語(yǔ)句與函數(shù)頭也有細(xì)微的差別,在函數(shù)原型語(yǔ)句中,其參數(shù)表中的每個(gè)參數(shù)允許只保留參數(shù)類型,而省略參數(shù)名,并且若使用參數(shù)名也允許與函數(shù)頭中對(duì)應(yīng)的參數(shù)名不同。
2. 常量形參
在定義一個(gè)函數(shù)時(shí),若只允許函數(shù)體訪問(wèn)一個(gè)形參的值,不允許修改它的值,則應(yīng)把該形參說(shuō)明為常量,這只要在形參說(shuō)明的前面加上const保留字進(jìn)行修飾即可。如:
void f9(const int x, const char y);
void f10(const char* p, char key);
在函數(shù)f9的函數(shù)體中只允許使用x和y的值,不允許修改它們的值。在函數(shù)f10的函數(shù)體中只允許使用p所指向的字符對(duì)象或字符數(shù)組對(duì)象的值,不允許修改它們的值,但在函數(shù)體中既允許使用也允許修改形參key的值。
3. 缺省參數(shù)
在一個(gè)函數(shù)定義中,可根據(jù)需要對(duì)參數(shù)表末尾的一個(gè)或連續(xù)若干個(gè)參數(shù)給出缺省值,當(dāng)調(diào)用這個(gè)函數(shù)時(shí),若實(shí)參表中沒(méi)有給出對(duì)應(yīng)的實(shí)參,則形參將采用這個(gè)缺省值。如:
void f11(int x, int y=0) {...}
int f12(int a[], char op='+', int k=10) {...}
函數(shù)f11的定義帶有兩個(gè)參數(shù),分別為整型變量x和y,并且y帶有缺省值0,若調(diào)用該函數(shù)的表達(dá)式為f11(a,b),將把a(bǔ)的值賦給x,把b的值賦給y,接著執(zhí)行函數(shù)體;若調(diào)用該函數(shù)的表達(dá)式為f11(a+b),則也是正確的調(diào)用格式,它將把a(bǔ)+b的值賦給x,因y沒(méi)有對(duì)應(yīng)的實(shí)參,將采用缺省值0,參數(shù)傳送后接著執(zhí)行函數(shù)體。
函數(shù)f12的定義帶有三個(gè)參數(shù),其中后兩個(gè)帶有缺省值,所以調(diào)用它的函數(shù)格式有三種,一種只帶一個(gè)實(shí)參,用于向形參a傳送數(shù)據(jù),后兩個(gè)形參采用缺省值,第二種帶有兩個(gè)實(shí)參,用于分別向形參a和op傳送數(shù)據(jù),第三個(gè)形參采用缺省值,第三種帶有三個(gè)實(shí)參,分別用于傳送給三個(gè)形參。
若一個(gè)函數(shù)帶有專門的函數(shù)原型語(yǔ)句,則形參的缺省值只能在該函數(shù)原型語(yǔ)句中給出,不允許在函數(shù)頭中給出。如對(duì)于上述的f11和f12函數(shù),其對(duì)應(yīng)的函數(shù)原型語(yǔ)句分別為:
void f11(int x, int y=0);
int f12(int a[], char op='+', int k=10);
函數(shù)定義應(yīng)分別改寫為:
void f11(int x, int y) {...}
int f12(int a[], char op, int k) {...}
4. 數(shù)組參數(shù)
在函數(shù)定義中的每個(gè)數(shù)組參數(shù)實(shí)際上是指向元素類型的指針參數(shù)。對(duì)于一維數(shù)組參數(shù)說(shuō)明:
數(shù)據(jù)類型 數(shù)組名[]
它與下面的指針參數(shù)說(shuō)明完全等價(jià):
數(shù)據(jù)類型 *指針變量名
其中指針變量名就是數(shù)組參數(shù)說(shuō)明中的數(shù)組名。如對(duì)于f12函數(shù)定義中的數(shù)組參數(shù)說(shuō)明int a[],等價(jià)于指針參數(shù)說(shuō)明int* a。也就是說(shuō),數(shù)組參數(shù)說(shuō)明中的數(shù)組名a是一個(gè)類型為int*的形參。注意:在變量定義語(yǔ)句中定義的數(shù)組,其數(shù)組名代表的是一個(gè)數(shù)組,它的值是指向第一個(gè)元素的指針常量,這與數(shù)組形參的含義有區(qū)別。
對(duì)于二維數(shù)組參數(shù)說(shuō)明:
數(shù)據(jù)類型 參數(shù)名[][第二維尺寸]
它與下面的指針參數(shù)說(shuō)明完全等價(jià):
數(shù)據(jù)類型 (*參數(shù)名)[第二維尺寸]
如對(duì)于f7函數(shù)定義中的二維數(shù)組參數(shù)說(shuō)明float c[][N],等價(jià)于指針參數(shù)說(shuō)明float(*c)[N]。
5. 函數(shù)類型
當(dāng)調(diào)用一個(gè)函數(shù)時(shí)就執(zhí)行一遍循環(huán)體,對(duì)于類型為非void的函數(shù),函數(shù)體中至少必須帶有一條return語(yǔ)句,并且每條return語(yǔ)句必須帶有一個(gè)表達(dá)式,當(dāng)執(zhí)行到任一條return語(yǔ)句時(shí),將計(jì)算出它的表達(dá)式的值,結(jié)束整個(gè)函數(shù)的調(diào)用過(guò)程,把這個(gè)值作為所求的函數(shù)值帶回到調(diào)用位置,參與相應(yīng)的運(yùn)算;對(duì)于類型為void的函數(shù),它不需要返回任何函數(shù)值,所以在函數(shù)體中既可以使用return語(yǔ)句,也可以不使用,對(duì)于使用的每條return語(yǔ)句不允許也不需要帶有表達(dá)式,當(dāng)執(zhí)行到任一條return語(yǔ)句時(shí),或執(zhí)行到函數(shù)體最后結(jié)束位置時(shí),將結(jié)束函數(shù)的調(diào)用過(guò)程,返回到調(diào)用位置向下繼續(xù)執(zhí)行。
6. 內(nèi)聯(lián)函數(shù)
當(dāng)在一個(gè)函數(shù)的定義或聲明前加上關(guān)鍵字inline則就把該函數(shù)聲明為內(nèi)聯(lián)函數(shù)。計(jì)算機(jī)在執(zhí)行一般函數(shù)的調(diào)用時(shí),無(wú)論該函數(shù)多么簡(jiǎn)單或復(fù)雜,都要經(jīng)過(guò)參數(shù)傳遞、執(zhí)行函數(shù)體和返回等操作。若把一個(gè)函數(shù)聲明為內(nèi)聯(lián)函數(shù)后,在程序編譯階段系統(tǒng)就有可能把所有調(diào)用該函數(shù)的地方都直接替換為該函數(shù)的執(zhí)行代碼,由此省去函數(shù)調(diào)用時(shí)的參數(shù)傳遞和返回操作,從而加快整個(gè)程序的執(zhí)行速度。通??砂岩恍┫鄬?duì)簡(jiǎn)單的函數(shù)聲明為內(nèi)聯(lián)函數(shù),對(duì)于較復(fù)雜的函數(shù)則不應(yīng)聲明為內(nèi)聯(lián)函數(shù)。從用戶的角度看,調(diào)用內(nèi)聯(lián)函數(shù)和一般函數(shù)沒(méi)有任何區(qū)別。下面就是一個(gè)內(nèi)聯(lián)函數(shù)定義的例子,它返回形參值的立方。
inline int cube(int n)
{
return n*n*n;
}