什麼是函式頭

時間 2021-08-30 11:00:26

1樓:無名村莊的大尾巴貓

函式頭是指函式體之前的所有部分。

應用於數學、程式設計領域。,作用是給出了該函式的返回型別。

一個函式的原型語句就是其函式頭的一個拷貝,當然要在最後加上語句接上結束符分號。函式原型語句與函式頭也有細微的差別,在函式原型語句中,其參數列中的每個引數允許只保留引數型別,而省略引數名,並且若使用引數名也允許與函式頭中對應的引數名不同。

2樓:匿名使用者

在一個函式定義中,函式體之前的所有部分稱為函式頭,它給出了該函式的返回型別、每個引數的次序和型別等函式原型資訊,所以當沒有專門給出函式原型說明語句時,系統就從函式頭中獲取函式原型資訊。

一個函式的原型語句就是其函式頭的一個拷貝,當然要在最後加上語句接上結束符分號。函式原型語句與函式頭也有細微的差別,在函式原型語句中,其參數列中的每個引數允許只保留引數型別,而省略引數名,並且若使用引數名也允許與函式頭中對應的引數名不同。

全文如下:

一)、定義格式

《型別名》 《函式名》 ([《參數列》]) 《函式體》

《型別名》為系統或使用者已定義的一種資料型別,它是函式執行過程中通過return語句要求返回的值的型別,又稱為該函式的型別。當一個函式不需要通過return語句返回一個值時,稱為無返回值函式或無型別函式,此時需要使用保留字void作為型別名。當型別名為int時,可以省略不寫,但為了清楚起見,還是寫明為好。

《函式名》是使用者為函式所起的名字,它是一個識別符號,應符合c++識別符號的一般命名規則,使用者通過使用這個函式名和實參表可以呼叫該函式。

《參數列》又稱形式參數列,它包含有任意多個(含0個,即沒有)引數說明項,當多於一個時其前後兩個引數說明項之間必須用逗號分開。每個引數說明項由一種已定義的資料型別和一個變數識別符號組成,該變數識別符號成為該函式的形式引數,簡稱形參,形參前面給出的資料型別稱為該形參的型別。一個函式定義中的《參數列》可以被省略,表明該函式為無參函式,若《參數列》用void取代,則也表明是無參函式,若《參數列》不為空,同時又不是保留字void,則稱為帶參函式。

《函式體》是一條複合語句,它以左花括號開始,到右花括號結束,中間為一條或若干條c++語句。

在一個函式的參數列中,每個引數可以為任一種資料型別,包括普通型別、指標型別、陣列型別、引用型別等,一個函式的返回值可以是除陣列型別之外的任何型別,包括普通型別、指標型別和引用型別等。另外,當不需要返回值時,應把函式定義為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)

在第一條函式定義中,函式名為f1,函式型別為void,參數列為空,此函式是一個無參無型別函式。若在f1後面的圓括號內寫入保留字void,也表示為無參函式。

在第二條函式定義中,僅帶有一個型別為int的形參變數x,該函式沒有返回值。

在第三條函式定義中,函式名為f3,函式型別為int,函式引數為x和p,其中x為int型普通引數,p為int*型指標引數。

在第四條函式定義中,函式名為f4,函式型別為char*,即字元指標型別,參數列中包含一個一維字元陣列引數。注意:在定義任何型別的一維陣列引數時,不需要給出維的尺寸,當然給出也是允許的,但沒有任何意義。

在第五條函式定義中,函式名為f5,返回型別為int,該函式帶有兩個形參,一個為 整型引用變數x,另一個為雙精度變數d。

在第六條函式定義中,函式名為f6,函式型別為int&,即整型引用,該函式帶有兩個形參,一個是整型陣列b,另一個是整型變數n。在這裡定義形引數組b所給出的維的尺寸10可以被省略。

在第七條函式定義中,函式名為f7,無函式型別,參數列中包含三個引數,一個為二維單精度型陣列c,第二個為整型變數m,第三個為單精度引用變數max。注意:當定義一個二維陣列引數時,第二維的尺寸必須給出,並且必須是一個常量表示式,第一維尺寸可給出也可不給出,其作用相同。

在第八條函式定義中,函式名為f8,返回型別為bool,即邏輯型別,該函式帶有兩個引數,一個為形參bt,它為elemtype的指標引用型別,另一個為形參item,它是elemtype的引用型別,其中elemtype為一種使用者定義的型別或是通過typedef語句定義的一個型別的別名。

三)、有關函式定義的幾點說明

1. 函式原型語句

在一個函式定義中,函式體之前的所有部分稱為函式頭,它給出了該函式的返回型別、每個引數的次序和型別等函式原型資訊,所以當沒有專門給出函式原型說明語句時,系統就從函式頭中獲取函式原型資訊。

一個函式必須先定義或宣告而後才能被呼叫,否則編譯程式無法判斷該呼叫的正確性。一個函式的宣告是通過使用一條函式原型語句實現的,當然使用多條相同的原型語句宣告同一個函式雖然多餘但也是允許的,編譯時不會出現錯誤。

在一個完整的程式中,函式的定義和函式的呼叫可以在同一個程式檔案中,也可以處在不同的程式檔案中,但必須確保函式原型語句與函式呼叫表示式出現在同一個檔案中,並且函式原型語句出現在前,函式的呼叫出現在後。

通常把一個程式中使用者定義的所有函式的原型語句組織在一起,構成一個標頭檔案,讓該程式中所含的每個程式檔案的開始(即所有函式定義之前)包含這個標頭檔案(通過#include命令實現),這樣不管每個函式的定義在**出現,都能夠確保函式先宣告後使用(即呼叫)這一原則的實現。

一個函式的原型語句就是其函式頭的一個拷貝,當然要在最後加上語句接上結束符分號。函式原型語句與函式頭也有細微的差別,在函式原型語句中,其參數列中的每個引數允許只保留引數型別,而省略引數名,並且若使用引數名也允許與函式頭中對應的引數名不同。

2. 常量形參

在定義一個函式時,若只允許函式體訪問一個形參的值,不允許修改它的值,則應把該形參說明為常量,這只要在形參說明的前面加上const保留字進行修飾即可。如:

void f9(const int& x, const char& y);

void f10(const char* p, char key);

在函式f9的函式體中只允許使用x和y的值,不允許修改它們的值。在函式f10的函式體中只允許使用p所指向的字元物件或字元陣列物件的值,不允許修改它們的值,但在函式體中既允許使用也允許修改形參key的值。

3. 預設引數

在一個函式定義中,可根據需要對參數列末尾的一個或連續若干個引數給出預設值,當呼叫這個函式時,若實參表中沒有給出對應的實參,則形參將採用這個預設值。如:

void f11(int x, int y=0)

int f12(int a, char op='+', int k=10)

函式f11的定義帶有兩個引數,分別為整型變數x和y,並且y帶有預設值0,若呼叫該函式的表示式為f11(a,b),將把a的值賦給x,把b的值賦給y,接著執行函式體;若呼叫該函式的表示式為f11(a+b),則也是正確的呼叫格式,它將把a+b的值賦給x,因y沒有對應的實參,將採用預設值0,引數傳送後接著執行函式體。

函式f12的定義帶有三個引數,其中後兩個帶有預設值,所以呼叫它的函式格式有三種,一種只帶一個實參,用於向形參a傳送資料,後兩個形參採用預設值,第二種帶有兩個實參,用於分別向形參a和op傳送資料,第三個形參採用預設值,第三種帶有三個實參,分別用於傳送給三個形參。

若一個函式帶有專門的函式原型語句,則形參的預設值只能在該函式原型語句中給出,不允許在函式頭中給出。如對於上述的f11和f12函式,其對應的函式原型語句分別為:

void f11(int x, int y=0);

int f12(int a, char op='+', int k=10);

函式定義應分別改寫為:

void f11(int x, int y)

int f12(int a, char op, int k)

4. 陣列引數

在函式定義中的每個陣列引數實際上是指向元素型別的指標引數。對於一維陣列引數說明:

《資料型別》 《陣列名》

它與下面的指標引數說明完全等價:

《資料型別》 *《指標變數名》

其中《指標變數名》就是陣列引數說明中的《陣列名》。如對於f12函式定義中的陣列引數說明int a,等價於指標引數說明int* a。也就是說,陣列引數說明中的陣列名a是一個型別為int*的形參。

注意:在變數定義語句中定義的陣列,其陣列名代表的是一個陣列,它的值是指向第一個元素的指標常量,這與陣列形參的含義有區別。

對於二維陣列引數說明:

《資料型別》 《引數名》[《第二維尺寸》]

它與下面的指標引數說明完全等價:

《資料型別》 (*《引數名》)[《第二維尺寸》]

如對於f7函式定義中的二維陣列引數說明float c[n],等價於指標引數說明float(*c)[n]。

5. 函式型別

當呼叫一個函式時就執行一遍迴圈體,對於型別為非void的函式,函式體中至少必須帶有一條return語句,並且每條return語句必須帶有一個表示式,當執行到任一條return語句時,將計算出它的表示式的值,結束整個函式的呼叫過程,把這個值作為所求的函式值帶回到呼叫位置,參與相應的運算;對於型別為void的函式,它不需要返回任何函式值,所以在函式體中既可以使用return語句,也可以不使用,對於使用的每條return語句不允許也不需要帶有表示式,當執行到任一條return語句時,或執行到函式體最後結束位置時,將結束函式的呼叫過程,返回到呼叫位置向下繼續執行。

6. 行內函數

當在一個函式的定義或宣告前加上關鍵字inline則就把該函式宣告為行內函數。計算機在執行一般函式的呼叫時,無論該函式多麼簡單或複雜,都要經過引數傳遞、執行函式體和返回等操作。若把一個函式宣告為行內函數後,在程式編譯階段系統就有可能把所有呼叫該函式的地方都直接替換為該函式的執行**,由此省去函式呼叫時的引數傳遞和返回操作,從而加快整個程式的執行速度。

通常可把一些相對簡單的函式宣告為行內函數,對於較複雜的函式則不應宣告為行內函數。從使用者的角度看,呼叫行內函數和一般函式沒有任何區別。下面就是一個行內函數定義的例子,它返回形參值的立方。

inline int cube(int n)

這些函式頭大概都是什麼意思,什麼是函式頭?

新人舊酒 很明顯 這斷 定義的是一個雙連結串列及相關操作 struct node 連結串列節點具體內容 函向前向後指標 struct nodeinfo 整個鍵表的整體資訊 struct nodeinfo node create 建立連結串列 void node free struct nodeinf...

c語言中的函式標頭檔案和返回值這三種定義是

函式一般來說就是一個根據給定輸入引數,得到一定輸出結果的一段 這個輸出結果就是返回值。拿廚房的豆漿機打個比方吧,函式就像豆漿機,加輸入 黃豆 進去,就得到輸出的返回值 黃豆豆漿 加花生進去,就得到花生豆漿。得到的豆漿就是函式的返回值 輸出 加的黃豆 花生就是實際引數 輸入 標頭檔案就類比為豆漿機的說...

什麼是函式,什麼叫函式?

函式就是在某變化過程中有兩個變數x和y,變數y隨著變數x一起變化,而且依賴於x。如果變數x取某個特定的值,y依確定的關係取相應的值,那麼稱y是x的函式。這一要領是由法國數學家黎曼在19世紀提出來的,但是最早產生於德國的數學家菜布尼茨。他和牛頓是微積分的發明者。17世紀末,在他的文章中,首先使用了 f...