C++學習第8篇-函數深入

來源:互聯網
上載者:User

1.  函數的形參和實參

1)形參和實參

通常的使用,函數參數(形參)和函數自變數(實參)是互連的。

函數形參-在函數原型和函式宣告中的變數:


函數實參-函數調用時,傳入代替函數形參的變數;


注意:函數的形參只有局部變數的範圍,函數調用結束,形參自然銷毀;

3種傳參方式:傳值、傳引用和傳地址

2. 值傳遞

值傳遞-將實參賦值給函數執行;


因為只是傳遞一個實參的拷貝,函數不能修改原來實參的值;


值傳遞的優點:

A)可以傳遞變數、數值和運算式;

B)參數不會被修改;

缺點:傳遞如結構體、類,需花費很長的時間;

在多數情況下,值傳遞是最好的函數參數傳遞方式,靈活和安全。

3. 引用傳遞

值傳遞的傳回值,只能通過函數的return來實現;

在多數情況下,值傳遞是合適的;但如需改變參數的值,如重排列一個數組時,修改實參是有效和清晰的;

引用傳遞,就可以修改參數的值;


再如:


函數一般只有一個傳回值,如需返回多個值,只需傳遞多個引用即可:


2)常量引用傳遞

引用傳遞,沒有值傳遞時結構體或者類對象時耗時;引用傳遞建立真正的實參,不拷貝任何資訊;

引用傳遞中,函數可以修改參數的值;如果不允許修改,可以採用常量引用才傳遞:


上面例子會出現編譯錯誤的!

使用常量引用傳遞的幾個原因:

A)協助編譯器保證不能改變的參數不會修改;B)告訴編程人員留意參數是否會被修改;C)協助編程人員調試錯誤值。

記住:通常採用常量引用傳遞,除非你確實需要改變參數的值。

引用傳遞的優點:

A)允許函數修改參數的值,有時非常有用的;B)引用不涉及到複製參數的資訊,所以較快;

C)可以傳遞常量引用,防止無目的的修改; D)可以返回多個值。

缺點:

A)非常量引用不能是數值和運算式,只能是變數;B)比較困難清晰說明傳遞的引用是輸入、輸出還是兩者皆是;

C)不能從函數調用確定參數是否被修改;

引用傳遞比值傳遞速度較慢!

4. 地址傳遞

地址傳遞是另一種變數傳遞方式,只傳遞變數的地址,而不是變數本身;函數形參必須是指標。


地址傳遞的典型應用在記憶體動態分配和數組訪問:


以上例子中,必須傳入數組的長度。

通常,在解引用地址傳遞的參數之前,最好對其進行null 指標判斷:


地址傳遞的優點:

A)允許函數改變參數的值;B)因為不進行拷貝,速度比較快;C)可以返回多個值。

缺點:A)參數不能為數值或運算式,必須是正常的變數;C)所有參數必須檢查是否為空白指標;D)較值傳遞慢。

引用傳遞通常比地址傳遞安全,引用傳遞是多數時候使用的方式。

2)值傳遞、引用傳遞和地址傳遞沒有很大的區別:

A)引用傳遞,在編譯器處理時,只作為指標處理;

B)和指標和引用傳遞的主要區別是引用傳遞有比較清晰和嚴格的文法;所以引用傳遞更安全,但相對不夠靈活;但在效率上是不相上下的。

D)地址傳遞只是傳遞地址的地址值,若函數改變此地址值,只是改變了臨時值,沒有改變地址的實際值。


儘管地址傳遞實際上是值傳遞,但依然可以修改傳遞地址的儲存的值;這時引用傳遞、地址傳遞和值傳遞的區別。

若需通過地址傳遞來修改參數的實際指向地址,可以傳遞地址的引用:


結論是:引用是指標,指標的地址是值傳遞。

5. 傳回值是值、引用和地址

值、引用和地址的返回給函數調用幾乎是一樣的。

1)值返回是最簡單和最安全的方式:

返回的變數或運算式可以包含函式宣告的局部變數;

對於結構體和類對象是比較慢的;

2)引用返回

引用返回必須是變數,調用者可以繼續使用該引用修改變數,很多時候是比較有用的,而且比較快速;

注意不能返回函數的局部定義的變數引用:


3)地址返回

地址返回只能返回變數的地址,不能是數值和表達的;

地址返回也是比較快速的,不能返回局部變數的地址;

若返回的是調用函數的局部定義變數的地址,編譯器會產生警告資訊的;

地址常用之一就是返回新的分配記憶體給調用者:

小結:

一般值返回是足夠使用的,足夠靈活和安全;引用返回和地址返回是比較有用的,特別是針對結構體和類對象的動態分配地址;

注意在引用返回和地址返回時,確保返回的不是函數自訂的局部變數的引用或地址。

6. 內嵌函式

函數的使用有幾大好處:函數代碼可重用;比較容易改變和更新代碼;使代碼更易讀和易寫;提供了類型檢查;

每次的函數調用,往往需要付出更多的操作;就地編碼較好;

就地編碼即調用函數時,直接將代碼嵌入當前位置;這是所謂的內嵌函式,使用關鍵字inline

內嵌函式比較適合短函數,特別是在迴圈內,而沒有分支。

7. 函數重載

函數重載是C++一大特性,允許建立不同的函數使用相同的名稱,而使用不同的參數;


注意函數的傳回型別不能作為函數重載的標誌;使用typedef不能理解為建立一個新的類型;

匹配重載函數可能出現的3中情況:

1) 找到匹配函數;2) 沒有找到匹配函數;3) 多個重載函數符合條件(歧義匹配)。

匹配重載函數的過程:

1)尋找最合適的;2)通過合理轉換的匹配(參數的升級轉換,如char->int);

3)通過強制的標準轉換(如int->double);4) 當以上都沒有找到,C++會遍曆使用者自訂函數;

歧義匹配屬於編譯運行錯誤。

處理歧義匹配:

1)定義一個新的重載函數;

2)顯式轉換歧義的參數到確定的類型;

小結:函數調用會明顯降低函數的靈活性,同時附帶少許的風險;函數重載或許比較複雜,但非常實用。

8. 預設參數

預設參數,即函數的形參已經賦予初始值。


預設參數是非常出色的選擇,當函數需要的預設的值,使用者可以也不需要修改;

注意:多於多個預設值,不能跳過賦值;

A) 所有的預設參數必須是由右到左的;B) 最右邊的預設值是最常覆蓋修改的;C) 預設值不能作為函數重載的標誌。

9. 函數指標

函數指標是比較進階的話題;對於數組名是一個地址,那麼函數名可以理解是函數的地址;

函數調用時,首先解引用函數名(即函數地址),擷取函數的地址入口,才開始執行;

函數指標即指標指向函數的地址,函數指標可以重新導向:

因為()的優先順序比*高,所以函數指標必須加括弧:


注意:函數指標的簽名(包括參數、傳回值等)必須匹配指向的函數的簽名。

函數指標調用,就如指向的函數的隱式調用一樣,如pFoo() ;

函數指標的通常應用是函數實現特定的功能,但你想使用者可以自定功能的實現;

如選擇排序:


10. 棧和堆

程式使用的記憶體地區分4個部分:

A)代碼區:編譯的程式放置的地方;B)全域區:存放全域變數的地方;C)堆:動態分配的變數存放地方;D)棧:形參和局部變數存放的地方。

1)堆-自由存放區,是動態分配的一個巨大緩衝池;


必須知道:順序的儲存請求,不一定得到實際上的順序儲存地區;

當動態分配的記憶體釋放,返回堆,作為新的可以分配的記憶體;

2)棧:只能從頂部取出和放入的操作:

top()、pop()、push()是常用的操作;

棧是first in, last out(FILO)的結構;

當棧的的儲存地區已經滿了,就會出現溢出。

不必要詳細瞭解棧的工作細節。

11. 遞迴

C++的遞迴就是函數的自身調用。

遞迴必須有終止條件,否則就為無限遞迴。如:


再如:求1到nValue的和:


樣本3:Fibonacci數:



12. 命名空間

命名空間概念,確切來說不歸入函數這部分,但是十分重要的概念。

程式中出現標識符(變數或函數名)在相同的範圍,即命名衝突。

這時,可以使用命名空間來解決,通過全域::運算子,來調用所需函數或變數;

亦可以通過using關鍵字,引入命名空間。

13. 捕捉錯誤

錯誤包括斷言、錯誤、退出和異常。

編程中,你不可能避免錯誤,包括文法和詞義錯誤;

語法錯誤-沒有按照相應的語言的文法格式編程;

詞義錯誤-程式沒有按照編程人員的意願,實現目標;不能被編譯器捕捉,

A)邏輯錯誤;B)冒犯性假設錯誤。

處理:

A)防禦錯誤;B)探測錯誤;

2)斷言-Assert

如果斷言的條件是true,程式不過處理,如果斷言的條件是false,則程式發出錯誤異常訊息並終止程式;


至此,C++面向過程編程已學習完畢,後面部分為C++物件導向編程的學習。Have Fun!!!!!!!

【免責特此聲明:
1)本內容可能是來自互連網的,或經過本人整理的,僅僅代表了互連網和個人的意見和看法!
2)本內容僅僅提供參考,任何參考該內容造成任何的後果,均與原創作者和本部落格作者無關!】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.