函式 (I)

使用函式,我們可以以更模組化的方式構建程式,從而在 C++ 中獲得結構化程式設計所能提供的全部潛力。

函式是一組語句,當從程式的某個點呼叫它時執行。以下是其格式

type name ( parameter1, parameter2, ...) { statements }

,其中
  • 型別是函式返回的資料的資料型別說明符。
  • 名稱是允許呼叫該函式的識別符號。
  • parameters (引數)(根據需要):每個引數都包含一個數據型別說明符,後跟一個識別符號,就像任何常規變數宣告一樣(例如int x),並在函式中充當常規區域性變數。它們允許在呼叫函式時將引數傳遞給函式。不同的引數用逗號分隔。
  • statements (語句)是函式的主體。它是用大括號括起來的語句塊{ }.

這是第一個函式示例

// function example
#include <iostream>
using namespace std;

int addition (int a, int b)
{
  int r;
  r=a+b;
  return (r);
}

int main ()
{
  int z;
  z = addition (5,3);
  cout << "The result is " << z;
  return 0;
}
The result is 8

為了檢查這段程式碼,首先要記住在本教程開頭所說的一句話:C++ 程式總是從main (主函式)函式開始執行。所以我們將從那裡開始。

我們可以看到main (主函式)函式首先宣告變數z的型別int (整型)。 之後,我們看到對名為addition (加法)的函式的呼叫。 注意,我們將能夠看到函式呼叫的結構與上面幾行程式碼中函式本身的宣告之間的相似性



引數和自變數有明顯的對應關係。在main (主函式)函式中,我們呼叫addition (加法)傳遞兩個值53,它們對應於為加法函式宣告的int aint b引數。

main (主函式)呼叫函式的時刻起,控制權由main (主函式)失去,並傳遞給函式addition (加法)。 呼叫中傳遞的兩個引數的值(53)被複制到函式內的區域性變數int aint b。 在函式中。

函式addition (加法)宣告另一個區域性變數 (int r),並透過表示式r=a+b,它將r賦值為a和 bba和 b的結果。 因為為53傳遞的實際引數分別是8.

,所以結果是

1
return (r);

以下程式碼行addition (加法)完成函式main (主函式),並將控制權返回給首先呼叫它的函式(在本例中為addition (加法))。 此時,程式從被呼叫中斷的同一點開始,繼續其正常過程。 但此外,由於函式中的return (返回)addition (加法)語句指定了一個值:變數的內容r (return (r);),該內容在當時的值為8。 此值將變為評估函式呼叫的值。


因此,由於函式返回的值是在評估時賦予函式呼叫本身的值,因此變數z將設定為addition (5, 3)返回的值,即8。 要用另一種方式解釋它,您可以想象對函式的呼叫(addition (5,3))實際上被它返回的值(8).

)取代。 main 中的以下程式碼行是

1
cout << "The result is " << z;

,正如您可能已經預料到的那樣,這會在螢幕上產生結果的列印。

變數的作用域


在函式或任何其他內部塊中宣告的變數的作用域僅限於它們自己的函式或它們自己的塊,不能在它們之外使用。例如,在前面的示例中,不可能直接在函式中使用變數a, 和 br,因為它們是函式main (主函式)的區域性變數。 此外,也不可能直接在函式中使用變數addition (加法),因為這是函式z的區域性變數, 因為這是函式addition (加法)的區域性變數。main (主函式).


因此,區域性變數的作用域僅限於宣告它們的同一塊級別。 儘管如此,我們也可以宣告全域性變數; 這些變數從程式碼的任何點(包括所有函式內部和外部)都可見。 為了宣告全域性變數,您只需在任何函式或塊之外宣告變數; 這意味著直接在程式的主體中。

這是另一個關於函式的示例

// function example
#include <iostream>
using namespace std;

int subtraction (int a, int b)
{
  int r;
  r=a-b;
  return (r);
}

int main ()
{
  int x=5, y=3, z;
  z = subtraction (7,2);
  cout << "The first result is " << z << '\n';
  cout << "The second result is " << subtraction (7,2) << '\n';
  cout << "The third result is " << subtraction (x,y) << '\n';
  z= 4 + subtraction (x,y);
  cout << "The fourth result is " << z << '\n';
  return 0;
}
The first result is 5
The second result is 5
The third result is 2
The fourth result is 6

在這種情況下,我們建立了一個名為subtraction (減法)的函式。 此函式唯一做的就是減去兩個傳遞的引數並返回結果。

儘管如此,如果我們檢查函式main (主函式),我們將看到我們對函式subtraction (減法)進行了多次呼叫。 我們使用了一些不同的呼叫方法,以便您瞭解函式可以被呼叫的其他方式或時刻。

為了完全理解這些示例,您必須再次考慮對函式的呼叫可以被函式呼叫本身將要返回的值所替換。 例如,第一種情況(您應該已經知道了,因為它與我們在以前的示例中使用過的模式相同)

1
2
z = subtraction (7,2);
cout << "The first result is " << z;

如果我們用它返回的值(即,5)替換函式呼叫,我們將得到

1
2
z = 5;
cout << "The first result is " << z;

, 以及

1
cout << "The second result is " << subtraction (7,2);

與之前的呼叫具有相同的結果,但在這種情況下,我們直接將對subtraction (減法)的呼叫作為插入引數傳遞給、cout。 只需考慮結果與我們編寫

1
cout << "The second result is " << 5;

相同,因為5是由subtraction (7,2).

返回的值。

1
cout << "The third result is " << subtraction (x,y);

subtraction (減法)的情況下, 我們唯一引入的新內容是subtraction (減法)的引數是變數而不是常量。 這完全有效。 在這種情況下,傳遞給函式的值是的值,分別是y53,得到2作為結果。

第四種情況大同小異。 只需注意,我們可以編寫

1
z = 4 + subtraction (x,y);

而不是

1
z = subtraction (x,y) + 4;

,結果完全相同。 我交換了位置,以便您可以看到分號 (;) 位於整個語句的末尾。 它不一定必須緊跟在函式呼叫之後。 解釋可能再次是,您想象一個函式可以被其返回值替換

1
2
z = 4 + 2;
z = 2 + 4;

沒有型別的函式。void 的用法。


如果你記得函式宣告的語法

type name ( argument1, argument2 ...) statement

您將看到宣告以型別開頭,這是函式本身的型別(即,函式將透過返回語句返回的資料的型別)。 但是如果我們不想返回值呢?

假設我們只想建立一個函式在螢幕上顯示一條訊息。 我們不需要它返回任何值。 在這種情況下,我們應該使用函式的void (空)型別說明符。 這是一個特殊的說明符,指示缺少型別。

// void function example
#include <iostream>
using namespace std;

void printmessage ()
{
  cout << "I'm a function!";
}

int main ()
{
  printmessage ();
  return 0;
}
I'm a function!

void (空)也可以在函式的引數列表中使用,以顯式指定我們希望該函式在呼叫時不接受任何實際引數。 例如,函式printmessage (列印資訊)可以宣告為

1
2
3
4
void printmessage (void)
{
  cout << "I'm a function!";
}

雖然在引數列表中指定void (空)是可選的。 在 C++ 中,如果我們想要一個沒有引數的函式,則可以簡單地將引數列表留空。

您必須始終記住的是,呼叫函式的格式包括指定其名稱並將引數括在括號中。 引數的不存在並不能免除我們編寫括號的義務。 因此,對printmessage (列印資訊)的 C++ 等效檔案是

1
printmessage ();

的呼叫必須始終使用括號。括號清楚地表明這是一個對函式的呼叫,而不是變數或其他 C++ 語句的名稱。 以下呼叫將是不正確的。

1
printmessage;
Index
目錄