1. 程式人生 > >Functions: C++'s Programming Modules

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

定義一個函式

函式可以分為兩類:

  • 沒有返回值的
  • 有返回值的

沒有返回值的相下面這樣

void
functionName(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,都是函式私有的。

當函式呼叫的時候,計算機便為這些變數分配記憶體;當函式結束時,會釋放這些變數。

多引數

傳遞給函式的多個引數用逗號分隔。