Functions: C++'s Programming Modules
在這一章中要學習以下內容:
- 函式基礎
- 函式原型
- 通過value向函式傳遞引數
- 設計處理陣列的函式
- 使用const指標引數
- 設計函式處理文字字串
- 設計函式處理結構體
- 設計函式處理string型別的物件
- 函式的遞迴
- 指向函式的指標(函式指標)
C++有一個龐大的有用的函式庫(standard ANSI C library + 幾個C++類),但是解決實際問題還需要定義我們自己的函式。
當然為了提高效率也需要STL和BOOST這些C++庫。
函式回顧
為了使用C++函式,你需要做以下的事情:
- 提供一個函式定義(function definition)
- 提供一個函式原型(function prototype)
- 呼叫函式(call the function)
下面提供了一個簡單的例子
#include <iostream> // function prototype void simple(); int main() { using namespace std; cout << "main() will call the simple() function:\n"; // function call simple(); cout << "main() is finished with the simple() function.\n"; return 0; } // function definition void simple() { using namespace std; cout << "I'm but a simple function.\n"; }
在main函式和simple函式中都放了一個using指令,是因為每個函式都使用了cout。
定義一個函式
函式可以分為兩類:
- 沒有返回值的
- 有返回值的
沒有返回值的相下面這樣
voidfunctionName(parameterList) { statement(s) // return是可選的 return; }
parameterList指定了傳遞給函式的引數的型別和個數。
可選的返回語句標誌著函式的結束。
函式的返回值不能是陣列,但可以是陣列的指標。
函式是如何返回值的?
一般來說,函式是通過複製返回值到指定的CPU暫存器或者記憶體位置來返回函式值的。
然後呼叫者會檢查那個位置。
呼叫函式和被呼叫函式必須對那個位置上返回型別達成一致。
原型和函式呼叫
函式的原型一般都放在include檔案中。
#include <iostream> // 無返回值的函式原型 void cheers(int); // 有返回值的函式原型 double cube(double x); int main() { using namespace std; // 函式呼叫 cheers(5); cout << "Give me a number: "; double side; cin >> side; // 函式呼叫 double volume = cube(side); cout << "A " << side << "-foot cube has a volume of "; cout << volume << " cubic feet.\n"; cheers(cube(2)); return 0; } void cheers(int n) { using namespace std; for (int i = 0; i < n; i++) cout << "Cheers! "; cout << endl; } double cube(double x) { return x * x * x; }
為什麼C++需要函式原型呢?
函式原型向編譯器描述了函式介面。
第一,原型告訴了編譯器函式應該接受幾個以及什麼型別的引數。
第二,編譯器需要知道要幾個位元組以及何種型別來解釋返回值。沒有這些資訊,編譯器只能靠猜。
為什麼C++編譯器不去檔案後面找函式定義呢?
原型符號(Prototype Syntax)
函式原型是一條語句,所以必須以分號結尾。
函式原型只需要型別資訊就夠了,引數名是什麼、要不要都無所謂,引數名只是起到佔位符的作用。
函式原型為你做了什麼
函式原型極大地減少了程式出錯的機率。
函式原型可以保證:
- 編譯器可以正確地處理返回值
- 編譯器可以檢查函式呼叫的引數是否正確
- 編譯器檢查是否使用了正確型別的引數
函式原型的檢查發生在編譯器,被稱為靜態型別檢查(static type check)。
通過值傳遞函式引數
C++一般通過值來傳遞引數(by value)。
數值型別的值會傳遞給一個新的變數。
通過值傳遞的引數稱為formal argument或者formal parameter。
而傳遞給函式的值稱為actual argument或者actual parameter。
為了簡化一點,C++用argument指實際引數,parameter稱為形式引數。
在函式中宣告的變數,包括parameters,都是函式私有的。
當函式呼叫的時候,計算機便為這些變數分配記憶體;當函式結束時,會釋放這些變數。
多引數
傳遞給函式的多個引數用逗號分隔。