計算機二級C++函式考點
函式作為計算機二級的文章" target="_blank" >計算機二級C++科目的重要考點內容,為了方便考生們進行知識點的鞏固,下面是小編為大家整理計算機二級C++函式考點,歡迎大家閱讀!
1函式定義
在標準C++中,函式的定義形式為:
<返回型別><函式名>(<形參列表>)
{
<函式體>
}
<函式名>一般是識別符號,一個程式只有一個main函式,其他函式名可隨意取(當然,必須避免使用C++的關鍵字),好的程式設計風格要求函式名最好是取有助於記憶的名字,如getchar函式,通過函式的名字可以知道函式的功能,這無疑會增加程式的可讀性。
<形參列表>是由逗號分隔的,分別說明函式的各個引數。形參將在函式被呼叫時從呼叫函式那裡獲得資料。在C++中,函式形參列表可以為空,即一個函式可以沒有引數。但即使函式形參列表為空,括起函式引數的一對圓括號也不允許省略。
<返回型別>又稱函式型別,表示一個函式所計算(或執行)的結果值的型別。如果一個函式沒有結果值,如函式僅用來更新(或設定)變數值、顯示資訊等,則該函式返回型別為void型別。一個沒有返回值的函式類似於一些程式語言(如pascal語言)中的過程(procedure)。
由一對花括號括起來的<函式體>是語句的序列,它定義了函式應執行的具體操作。
需要注意的是,C++不允許函式定義巢狀,即在一個函式體內不能包含有其他函式的定義。
2函式呼叫
C++中函式呼叫的一般形式為:
<函式名>(<實參表>)
當呼叫一個函式時,其實參的個數、型別及排列次序必須與函式定義時的形參相一致,也就是說實參與形參應該一對一地匹配。當函式定義時沒有形參,則函式呼叫時,<實參表>亦為空。
依據對函式返回值的使用方式,函式的呼叫方法可分為以下幾種:
(1)語句呼叫,這通常用於不帶返回值的函式。這種情況下,被呼叫函式作為一個獨立的語句出現在程式中。
(2)表示式呼叫。將被呼叫函式作為表示式的一部分來進行呼叫。它適用於被呼叫函式帶有返回值的情況。
(3)引數呼叫。被呼叫函式作為另一個函式的一個引數進行呼叫。
3函式原型
在C++中,函式在使用之前要預先宣告。這種宣告在標準C++中稱為函式原型(functionprototype),函式原型給出了函式名、返回型別以及在呼叫函式時必須提供的引數的個數和型別。函式原型的語法為:
<返回型別><函式名>(<形參列表>);
(注意在函式原型後要有分號)
實際上函式原型說明有兩種形式:
(1)直接使用函式定義的頭部,並在後面加上一個分號。
(2)在函式原型說明中省略引數列表中的形參變數名,僅給出函式名、函式型別、引數個數及次序。
注意:在C++中,在呼叫任何函式之前,必須確保它已有原型說明。函式原型說明通常放在程式檔案的頭部,以使得該檔案中所有函式都能呼叫它們。實際上,標準函式的原型說明放在了相應的標頭檔案中,這也是為什麼在呼叫標準函式時必須要包含相應的標頭檔案的原因之一。
在瞭解了函式定義、函式呼叫和函式原型之後,就可以寫出一個完整的C++程式,並可將其編譯和執行。
4函式返回型別
根據函式是否帶有引數以及函式是否有返回值,可以將函式分為如下四類。
1帶引數的有返回值函式
定義形式為:
<返回型別><函式名>(<引數列表>)
{
<語句序列>
}
2不帶引數的有返回值函式
定義形式為:
<返回型別><函式名>()
{
<語句序列>
}
3帶引數的無返回值函式
定義形式為:
void<函式名>(<引數列表>)
{
<語句序列>
}
4不帶引數的無返回值函式
定義形式為:
void<函式名>()
{
<語句序列>
}
5函式引數
C++中,函式之間傳遞引數有傳值和傳地址兩種傳遞方式。此外,C++還提供了預設引數機制,可以簡化複雜函式的呼叫。
1引數的傳遞方式
(1)傳值
傳值是將實參值的`副本傳遞(拷貝)給被呼叫函式的形參。它是C++的預設引數傳遞方式,在此之前的多數函式引數傳遞都是傳值。
由於傳值方式是將實參的值複製到形參中,因此實參和形參是兩個不同的變數,有各自的儲存空間,可以把函式形參看作是函式的區域性變數。傳值的最大好處是函式呼叫不會改變呼叫函式實參變數的內容,可避免不必要的副作用。
(2)傳地址
有時我們確實需要通過函式呼叫來改變實參變數的值,或通過函式呼叫返回多個值(return語句只能返回一個值),這時僅靠傳值方式是不能達到目的。
2預設引數
在C++中,可以為引數指定預設值,在函式呼叫時沒有指定與形參相對應的實參時就自動使用預設值。預設引數可以簡化複雜函式的呼叫。
預設引數通常在函式名第一次出現在程式中的時候,如在函式原型中,指定預設引數值。指定預設引數的方式從語法上看與變數初始化相似。
6函式過載
如果能用同一個函式名字在不同型別上做相類似的操作就會方便很多,這種情況即為函式過載。其實這一技術早已用於C++的基本運算子。例如加法操作只有一個運算子+,但它卻可以用來做整型數、浮點數和指標的加法運算。將這一思想推廣到函式,即為函式過載。
7行內函數
C++引入內聯(inline)函式的原因是用它來取代C中的預處理巨集函式。行內函數和巨集函式的區別在於,巨集函式是由前處理器對巨集進行替換,而行內函數是通過編譯器來實現的,因此行內函數是真正的函式,只是在呼叫的時候,行內函數像巨集函式一樣的展開,所以它沒有一般函式的引數壓棧和退棧操作,減少了呼叫開銷,因此,行內函數比普通函式有更高的執行效率。
在C++中使用inline關鍵字來定義行內函數。inline關鍵字放在函式定義中函式型別之前。不過,編譯器會將在類的說明部分定義的任何函式都認定為行內函數,即使它們沒有用inline說明。
8遞迴函式
如果一個函式在其函式體內直接或間接地呼叫了自己,該函式就稱為遞迴函式。遞迴是解決某些複雜問題的十分有效的方法。遞迴適用以下的一般場合。
(1)資料的定義形式按遞迴定義。
(2)資料之間的關係(即資料結構)按遞迴定義,如樹的遍歷,圖的搜尋等。
(3)問題解法按遞迴演算法實現,例如回溯法等。
使用遞迴需要注意以下幾點:
(1)用遞迴編寫程式碼往往較為簡潔,但要犧牲一定的效率。因為系統處理遞迴函式時都是通過壓棧/退棧的方式實現的。
(2)無論哪種遞迴呼叫,都必須有遞迴出口,即結束遞迴呼叫的條件。
(3)編寫遞迴函式時需要進行遞迴分析,既要保證正確使用了遞迴語句,還要保證完成了相應的操作。
9變數作用域與生存週期
1C++中變數的儲存型別分為如下幾種型別:
auto——函式內部的區域性變數(auto可省略不寫)。
static——靜態儲存分配,又分為內部和外部靜態。
extern——全域性變數(用於外部變數說明)。
register——變數儲存在硬體暫存器中。
(1)自動變數
①在函式內部定義的區域性變數即為自動變數,用於說明自動變數的關鍵字auto可以省略。
②在函式頭部定義的自動變數作用域為定義它的函式;而在塊語句中定義的自動變數作用域為所在塊。與C不同,C++還允許在變數使用之前才定義變數。
③編譯程式不給自動變數賦予隱含的初值,故其初值不確定。因此,每次使用自動變數前,必須明確地賦初值。
④形參可以看成是函式的自動變數,作用域僅限於相應函式內。
⑤自動變數所使用的儲存空間由程式自動地建立和釋放。當函式呼叫時為自動變數建立儲存空間,函式呼叫結束時將自動釋放為其建立的儲存空間。因此,自動變數隨函式的呼叫而存在並隨函式呼叫結束而消失,由一次呼叫到下一次呼叫之間不儲存值。
(2)外部變數
①在函式外部定義的變數即為外部變數。
②外部變數的作用域是整個程式(全域性變數)。
③在C++中,程式可以分別放在幾個原始檔上,每個檔案可作為一個編譯單位分別編譯。外部變數只需在某個檔案上定義一次,其他檔案若要引用此變數時,應用extern加以說明。(外部變數定義時不必加extern關鍵字)。
④在同一檔案中,若前面的函式要引用在其後面定義的外部(在函式之外)變數時,也應用extern加以說明。
⑤外部變數是由編譯程式在編譯時給其分配空間,屬於靜態分配變數,對於數值型(整型、浮點型和字元型)外部變數來說,其有隱含初值0。
引進外部變數的原因:其一是隻要程式執行外部變數的值是始終存在的;其二是外部變數可以在所有函式間共享。
在C++中,可以使用外部變數,但是,必須要清楚使用外部變數的副作用。使用外部變數的函式獨立性差,通常不能被移植到其他程式中,而且,如果多個函式都使用到某個外部變數,一旦出現問題,就很難發現問題是由哪個函式引起的。在C++中,儘量不用或少用外部變數,可使用引數在函式間進行資料的傳遞。