學習C++ -> 函數( Function )


學習C++ -> 函數( Function )

 



一、函數的介紹
    在過程化編程中, 為了將一個較大的功能順利實現, 通常會將這個大的功能進行分解, 例如要實現一個學生信息管理系統, 一個學生信息管理系統至少包括學生信息的 添加查詢刪除修改 等功能, 這些功能要求就是對該系統的初步分解, 然后以 查詢 功能為例對其繼續分解, 查詢 功能可以再次分解為由以下幾個功能組成的模塊:
    
        ①. 獲取用戶查詢條件 ;
        ②. 到數據庫查詢該學生信息 ;
        ③. 按照一定格式輸出查詢結果。
        
    如果感覺該功能實現起來還是比較困難那么就繼續分解, 直到可以順利實現。這些功能分解后的實現就是依靠函數, 函數在廣義上理解為具有具體功能的一個模塊, 在函數實現后, 通過對函數的調用來使用這個功能。
    
    

 

 


二、函數的調用過程
    在任何一個有效的C++程序中, 都有一個被稱為主函數的函數 - main(), 該函數又被稱為C++程序的入口函數, 該函數的作用是告訴程序應該從這里開始執行指令, 也就是說, 任何一個C++程序都是從 main() 函數處開始執行, 直到執行過程中遇到程序的結束指令。
    
    C++中, 函數的之間可以互相調用, 不存在函數的等級關系而導致的不行調用的情況。 也就是說, main函數可以調用任何函數, 也包括自身; 自定義的函數可以調用其他自定義的函數, 或者庫函數, 自定義函數同樣也可以調用main函數。
    
    其一般的調用關系如圖:


    
    對圖示中的解說:
        在該圖示中, 用箭頭來描述調用關系, 箭頭指向誰就表明誰被調用, 箭頭的尾部是指函數在那里被使用。可以看到, 圖中main()函數一共調用了 函數1()、函數2()、...函數n()這些函數, 而 函數1() 的實現又調用了 函數3, 函數3 的實現又調用了 函數2 才得以完成。函數2被重復調用了兩次, 一次是在 main() 函數中, 一次是在函數3()中, 相當於被重復利用了兩次。
        
        在這個圖示中就體現出了使用函數的另一個優勢, 代碼可以反復利用, 把一些簡單基礎的功能寫成一個函數, 什么時候使用就什么時候調用, 不必再麻煩的寫一次。
        
        

 

 


三、一個函數的示例
    這里舉例通過調用一個函數來輸出"hello, world":

 1     #include<iostream>
 2 
 3     using namespace std;
 4 
 5     //定義sayHello函數
 6     void sayHello()
 7     {
 8         //大括號里面為函數功能的實現
 9         cout<<"Hello, world!\n" ;
10     }
11 
12     int main()
13     {
14         sayHello() ;        //調用自定義的sayHello函數
15 
16         return 0 ;
17     }


    編譯運行后將在屏幕上輸出"hello, world", 與直接在main函數中使用cout輸出的結果相同。 在這個示例中, 我們定義了名為 sayHello 的函數, 名字的前面 void 是他的返回值類型,  緊跟着后面的大括號中的內容就是該函數具體的實現過程, 也稱為函數體, 由於我們給該函數的功能為在屏幕上輸出 "hello, world" 即可, 所以函數體內只寫了一行 cout<<"Hello, world!\n" ;
    
    定義完sayHello函數就可以在main函數中調用了, 調用的過程很簡單, 函數名加一對小括號再加上后面的分號即可。
    
    

 

 


四、函數的定義以及調用
    一個函數的定義是有函數頭與函數實現部分組成, 一般形式如下:
        返回值類型 函數名(參數列表)
        {
            函數體
        }
        
    1>. 返回值類型
        函數在執行完畢后會返回一個值表示函數已經執行完畢, 這個值可以是隨便定義的一個值, 也可以是函數經過計算/操作后得到的結果, 他可以是 char、int、float、double、指針類型等, 也可以是后面將會學到的自定義數據類型。
        
        要返回某個值需要用 return 語句; 來進行返回。 當函數執行到 return 語句時會返回一個值並結束函數的執行, 即使后面還有語句也不會再執行了。
        例如我們把上面那個sayHello函數改成有返回值類型的如下:

 1         #include<iostream>
 2 
 3         using namespace std;
 4 
 5         //定義sayHello函數
 6         int sayHello()
 7         {
 8             //大括號里面為函數功能的實現
 9             cout<<"Hello, world!\n" ;
10             return 100 ;    //執行完畢時返回值100
11             cout<<"succeed!\n" ;
12 
13         }
14 
15         int main()
16         {
17             int val = 0;
18             val = sayHello() ;        //調用自定義的sayHello函數, 把返回值賦值給變量val
19             cout<<"Return Value: "<<val<<endl ;     //輸出sayHello函數的返回值
20 
21             return 0;
22         }

 
    輸出:

        Hello, world!
        Return Value: 100

        Process returned 0 (0x0)   execution time : 0.594 s
        Press any key to continue.


        這次把 sayHello 函數的返回類型改為了int, 其返回值為100, 並且我們還是 return 語句后加了一句 cout<<"succeed!\n" ; 用於判斷函數執行到return語句時是否真的結束了, 根據輸出結果來看, 真的結束了, 后面的 "succeed!" 沒有被輸出 。
        
        在main函數中定義了一個int型(與返回值類型一致)的變量val用來保存sayHello函數的返回值, 並將他輸出。
        
    2>. 函數名
        函數名只要符合C++標識符定義的要求即可, 即只能以字母、數字、下划線組成, 並且不能以數字開頭。在符合要求的基礎上盡量讓命名簡潔明確, 最好能讓人一看函數名就能大致猜測出該函數的功能是什么。
        
    3>. 參數列表
        參數列表是用來向函數內傳遞信息, 比如要要函數來比較兩個數的大小, 並輸出較大的那個, 不讓函數知道哪兩個數怎么行。
        例: 向函數傳遞兩個int型值輸出較大的一個
        

 1         #include<iostream>
 2 
 3         using namespace std;
 4 
 5         //定義max函數
 6         void max(int a, int b)        //int a, int b即為參數列表
 7         {
 8             if(a>b)
 9                 cout<< a << endl ;
10             else
11                 cout<< b << endl ;
12         }
13 
14         int main()
15         {
16             int x = 10, y = 20 ;        //待比較的數
17             max(x, y) ;                 //調用並傳入x和y的值
18 
19             return 0;
20         }


    在聲明參數列表時, int a, int b, 為兩個int型, 表示將要傳入兩個參數, 傳入的第一個參數將由a表示, a的值就是傳進來的第一個參數的值; 第二個參數由b表示, 同樣, b的值就是傳進來第二個參數的值, a、b稱為形參, 也稱"形式參數"。


    main函數中調用max函數傳入的為x, y, 這里x, y稱為實參。所以在該程序中, 參數列表中a的值就是x的值, b的值就是y的值, 因此我們就可以在函數體內根據a, b的值判斷x, y誰大誰小。
       


    
今天主要學習了有關函數的一些基礎知識, 明天將繼續對函數進行進一步的學習。
    
    

 

命運如同手中的掌紋,無論多么曲折,但終掌握在自己手中。   


--------------------



wid, 2013.01.23



上一篇: 學習C++ -> 引用( References )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM