學習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 )