C++函數考點歸納

<函數名>一般是標識符,一個程序只有一個main函數,其他函數名可隨意取(當然,必須避免使用C+ +的關鍵字),以下是小編爲大家搜索整理的C++函數考點歸納, 希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!

C++函數考點歸納

  1 函數定義

在標準C+ +中,函數的定義形式爲:

<返回類型><函數名>(<形參列表>)

{

<函數體>

<函數名>一般是標識符,一個程序只有一個main函數,其他函數名可隨意取(當然,必須避免使用C+ +的關鍵字),好的程序設計風格要求函數名最好是取有助於記憶的名字,如getchar函數,通過函數的名字可以知道函數的功能,這無疑會增加程序的可讀性。

<形參列表>是由逗號分隔的,分別說明函數的各個參數。形參將在函數被調用時從調用函數那裏獲得數據。在C+ +中,函數形參列表可以爲空,即一個函數可以沒有參數。但即使函數形參列表爲空,括起函數參數的一對圓括號也不允許省略。

<返回類型>又稱函數類型,表示一個函數所計算(或運行)的結果值的類型。如果一個函數沒有結果值,如函數僅用來更新(或設置)變量值、顯示信息等,則該函數返回類型爲void類型。一個沒有返回值的函數類似於一些程序語言(如pascal語言)中的過程(procedure)。

由一對花括號括起來的<函數體>是語句的序列,它定義了函數應執行的具體操作。

需要注意的是,C+ +不允許函數定義嵌套,即在一個函數體內不能包含有其他函數的定義。

  2 函數調用

C+ +中函數調用的一般形式爲:

<函數名>(<實參表>)

當調用一個函數時,其實參的個數、類型及排列次序必須與函數定義時的形參相一致,也就是說實參與形參應該一對一地匹配。當函數定義時沒有形參,則函數調用時,<實參表>亦爲空。

依據對函數返回值的使用方式,函數的調用方法可分爲以下幾種:

(1)語句調用,這通常用於不帶返回值的函數。這種情況下,被調用函數作爲一個獨立的語句出現在程序中。

(2)表達式調用。將被調用函數作爲表達式的一部分來進行調用。它適用於被調用函數帶有返回值的情況。

(3)參數調用。被調用函數作爲另一個函數的一個參數進行調用。

  3 函數原型

在C+ +中,函數在使用之前要預先聲明。這種聲明在標準C+ +中稱爲函數原型(function prototype),函數原型給出了函數名、返回類型以及在調用函數時必須提供的參數的個數和類型。函數原型的語法爲:

<返回類型><函數名>(<形參列表>);

(注意在函數原型後要有分號)

實際上函數原型說明有兩種形式:

(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)編寫遞歸函數時需要進行遞歸分析,既要保證正確使用了遞歸語句,還要保證完成了相應的操作。

5.9 變量作用域與生存週期

1?C+ +中變量的存儲類型分爲如下幾種類型:

auto——函數內部的局部變量(auto可省略不寫)。

static——靜態存儲分配,又分爲內部和外部靜態。

extern——全局變量(用於外部變量說明)。

register——變量存儲在硬件寄存器中。

(1)自動變量

①在函數內部定義的局部變量即爲自動變量,用於說明自動變量的關鍵字auto可以省略。

②在函數頭部定義的自動變量作用域爲定義它的函數;而在塊語句中定義的自動變量作用域爲所在塊。與C不同,C+ +還允許在變量使用之前才定義變量。

③編譯程序不給自動變量賦予隱含的初值,故其初值不確定。因此,每次使用自動變量前,必須明確地賦初值。

④形參可以看成是函數的自動變量,作用域僅限於相應函數內。

⑤自動變量所使用的存儲空間由程序自動地創建和釋放。當函數調用時爲自動變量創建存儲空間,函數調用結束時將自動釋放爲其創建的存儲空間。因此,自動變量隨函數的調用而存在並隨函數調用結束而消失,由一次調用到下一次調用之間不保存值。

(2)外部變量

①在函數外部定義的變量即爲外部變量。

②外部變量的作用域是整個程序(全局變量)。

③在C+ +中,程序可以分別放在幾個源文件上,每個文件可作爲一個編譯單位分別編譯。外部變量只需在某個文件上定義一次,其他文件若要引用此變量時,應用extern加以說明。(外部變量定義時不必加extern關鍵字)。

④在同一文件中,若前面的函數要引用在其後面定義的外部(在函數之外)變量時,也應用extern加以說明。

⑤外部變量是由編譯程序在編譯時給其分配空間,屬於靜態分配變量,對於數值型(整型、浮點型和字符型)外部變量來說,其有隱含初值0。

引進外部變量的原因:其一是隻要程序運行外部變量的值是始終存在的;其二是外部變量可以在所有函數間共享。

在C+ +中,可以使用外部變量,但是,必須要清楚使用外部變量的副作用。使用外部變量的函數獨立性差,通常不能被移植到其他程序中,而且,如果多個函數都使用到某個外部變量,一旦出現問題,就很難發現問題是由哪個函數引起的。在C+ +中,儘量不用或少用外部變量,可使用參數在函數間進行數據的傳遞。

(3)靜態變量

內部靜態變量:

①在局部變量前加上“static”關鍵字就成爲內部靜態變量。

②內部靜態變量仍是局部變量,其作用域仍在定義它的函數內。但該類型變量採用靜態存儲分配,當函數執行完,返回調用點時,該變量並不撤消,其值將繼續保留,若下次再進入該函數時,其值仍然存在。內部靜態變量有隱含初值0,並且只在編譯時初始化一次。

外部靜態變量:

①在函數外部定義的變量前加上“static”關鍵字便成了外部靜態變量。

②外部靜態變量的作用域爲定義它的文件,即成爲該文件的“私有”(private)變量,只有其所在文件上的函數可以訪問該外部靜態變量,而其他文件上的函數一律不得直接訪問該變量,除非通過外部靜態變量所在文件上的各種函數來對它進行操作,這也是一種實現數據隱藏的方式。

③與內部靜態變量一樣,外部靜態變量也採用靜態存儲分配,有隱含初值0。

在C+ +中,除了支持C風格的內部和外部靜態變量的使用之外,還可將類成員聲明成static,它有着不同的含義。

(4)寄存器變量

①只有自動(局部)變量和函數參數可指定爲寄存器存儲類,它的作用域與生存期與自動變量完全相同。

②當指定的寄存器變量個數超過系統所能提供的寄存器數量時,多出的寄存器變量將視同自動變量。

③只限於int,char,short,unsigned和指針類型可使用register存儲類。

④不能對寄存器變量取地址(即&操作)。

⑤使用寄存器變量可以提高存取速度,可將使用頻率最高的變量說明成爲寄存器變量。一般常用於說明循環變量。

由於硬件的快速發展,存儲器(如內存)的性能有了很大的改進,因此,目前在實際應用中,使用register來說明變量的情況並不多。

2?生存週期

(1)變量由編譯程序在編譯時給其分配存儲空間(稱爲靜態存儲分配),並在程序執行過程中始終存在,這類變量包括全局變量、外部靜態變量和內部靜態變量。這類變量的生存週期與程序的運行週期相同,當程序運行時,該變量的生存週期隨即存在,程序運行結束,變量的生存週期隨即終止。

(2)變量由程序在運行時自動給其分配存儲空間(稱爲自動存儲分配),這類變量爲函數(或塊)中定義的自動變量。它們在程序執行到該函數(或塊)時被創建,在函數(或塊)執行結束時釋放所用的空間。