5.5 函數參數
C+ +中,函數之間傳遞參數有傳值和傳地址兩種傳遞方式。此外,C+ +還提供了默認參數機制,可以簡化復雜函數的調用。
1參數的傳遞方式
(1)傳值
傳值是將實參值的副本傳遞(拷貝)給被調用函數的形參。它是C+ +的默認參數傳遞方式,在此之前的多數函數參數傳遞都是傳值。
由于傳值方式是將實參的值復制到形參中,因此實參和形參是兩個不同的變量,有各自的存儲空間,可以把函數形參看作是函數的局部變量。傳值的最大好處是函數調用不會改變調用函數實參變量的內容,可避免不必要的副作用。
(2)傳地址
有時我們確實需要通過函數調用來改變實參變量的值,或通過函數調用返回多個值(return語句只能返回一個值),這時僅靠傳值方式是不能達到目的。
2默認參數
在C+ +中,可以為參數指定默認值,在函數調用時沒有指定與形參相對應的實參時就自動使用默認值。默認參數可以簡化復雜函數的調用。
默認參數通常在函數名第一次出現在程序中的時候,如在函數原型中,指定默認參數值。指定默認參數的方式從語法上看與變量初始化相似。
5.6 函數重載
如果能用同一個函數名字在不同類型上做相類似的操作就會方便很多,這種情況即為函數重載。其實這一技術早已用于C+ +的基本運算符。例如加法操作只有一個運算符+,但它卻可以用來做整型數、浮點數和指針的加法運算。將這一思想推廣到函數,即為函數重載。
5.7 內聯函數
C+ +引入內聯(inline)函數的原因是用它來取代C中的預處理宏函數。內聯函數和宏函數的區(qū)別在于,宏函數是由預處理器對宏進行替換,而內聯函數是通過編譯器來實現的,因此內聯函數是真正的函數,只是在調用的時候,內聯函數像宏函數一樣的展開,所以它沒有一般函數的參數壓棧和退棧操作,減少了調用開銷,因此,內聯函數比普通函數有更高的執(zhí)行效率。
在C+ +中使用inline關鍵字來定義內聯函數。inline關鍵字放在函數定義中函數類型之前。不過,編譯器會將在類的說明部分定義的任何函數都認定為內聯函數,即使它們沒有用inline說明。
5.8 遞歸函數
如果一個函數在其函數體內直接或間接地調用了自己,該函數就稱為遞歸函數。遞歸是解決某些復雜問題的十分有效的方法。遞歸適用以下的一般場合。
(1)數據的定義形式按遞歸定義。
(2)數據之間的關系(即數據結構)按遞歸定義,如樹的遍歷,圖的搜索等。
(3)問題解法按遞歸算法實現,例如回溯法等。
使用遞歸需要注意以下幾點:
(1)用遞歸編寫代碼往往較為簡潔,但要犧牲一定的效率。因為系統(tǒng)處理遞歸函數時都是通過壓棧/退棧的方式實現的。
(2)無論哪種遞歸調用,都必須有遞歸出口,即結束遞歸調用的條件。
(3)編寫遞歸函數時需要進行遞歸分析,既要保證正確使用了遞歸語句,還要保證完成了相應的操作。
編輯推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |