什麼是函數?¶
在編程中,函數就像一個“代碼小工具”,它把一段特定功能的代碼封裝起來,讓我們可以重複使用。比如數學中的函數f(x)=2x,輸入x就能得到對應的結果;C++中的函數也是如此,輸入一些數據(參數),就能得到一個結果(返回值),或者完成某些操作。
爲什麼要用函數?最直接的好處是代碼複用和結構清晰。比如我們要多次計算兩個數的和,直接寫一個函數就能避免重複寫加法代碼,修改也只需要改函數里的邏輯,不用到處找重複的代碼。
函數的定義¶
定義一個函數需要包含幾個部分:返回值類型、函數名、參數列表和函數體。
基本格式:¶
返回值類型 函數名(參數類型1 參數名1, 參數類型2 參數名2, ...) {
// 函數體:具體要執行的代碼
return 返回值; // 如果返回值類型是void,return可以省略或只寫return;
}
舉個例子:計算兩數之和¶
// 定義一個函數,接收兩個int類型的參數,返回它們的和
int add(int a, int b) { // a和b是形參(形式參數),表示接收的數據
int sum = a + b; // 函數體:計算a和b的和
return sum; // 返回計算結果(必須和返回值類型一致)
}
- 返回值類型:
int表示這個函數會返回一個整數。如果函數不需要返回值,用void(比如打印信息的函數)。 - 函數名:
add,要見名知意(比如計算和用add,交換用swap)。 - 參數列表:
(int a, int b),括號裏是函數接收的參數,每個參數需要指定類型和名稱。 - 函數體:大括號
{}裏的代碼,是函數要執行的具體操作。
函數的調用¶
定義好函數後,需要在其他地方“調用”它才能執行。調用函數時,我們需要提供實參(實際傳入的參數),實參會被複制給形參。
調用格式:¶
函數名(實參1, 實參2, ...); // 無返回值時直接調用
返回值類型 變量 = 函數名(實參1, 實參2, ...); // 有返回值時接收結果
例子:在主函數中調用add函數¶
#include <iostream>
using namespace std;
// 定義add函數(前面的例子)
int add(int a, int b) {
return a + b;
}
int main() {
int x = 5, y = 3;
// 調用add函數,傳入x和y作爲實參
int result = add(x, y); // 接收返回值
cout << "5 + 3 = " << result << endl; // 輸出:5 + 3 = 8
return 0;
}
關鍵點:調用時實參的類型和數量必須和函數定義的形參匹配(比如add需要兩個int,就不能傳一個字符串進去)。
參數傳遞的幾種方式¶
參數傳遞是函數的核心概念,主要有兩種方式:值傳遞和引用傳遞(初學者先掌握值傳遞,引用傳遞簡單瞭解即可)。
1. 值傳遞(最常用)¶
值傳遞是默認的參數傳遞方式,它會把實參的值複製一份傳給形參。此時,形參的修改不會影響實參。
例子:值傳遞的特點¶
#include <iostream>
using namespace std;
// 值傳遞:修改形參a不影響實參x
void changeValue(int a) {
a = 100; // 只修改形參a
}
int main() {
int x = 10;
changeValue(x); // 調用函數,傳入x
cout << "x的值:" << x << endl; // 輸出:x的值:10(實參未被修改)
return 0;
}
爲什麼? 因爲值傳遞是“複製實參的值給形參”,相當於函數里的a是x的一個“副本”,修改a和x無關。
2. 引用傳遞(&符號)¶
如果希望函數能修改實參的值(比如交換兩個變量),可以用引用傳遞。引用傳遞用&表示,形參和實參是同一個變量,修改形參會直接影響實參。
例子:引用傳遞實現交換功能¶
#include <iostream>
using namespace std;
// 引用傳遞:形參是實參的“別名”,修改會影響實參
void swap(int &a, int &b) { // a和b是引用,指向實參x和y
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 5, y = 10;
swap(x, y); // 調用時傳入x和y的引用
cout << "x = " << x << ", y = " << y << endl; // 輸出:x = 10, y = 5
return 0;
}
關鍵點:引用傳遞必須用&符號,且調用時實參必須是變量(不能傳常量或表達式)。
3. 默認參數(可選參數)¶
在定義函數時,可以給參數設置默認值,調用時如果不傳入該參數,就會使用默認值。這能簡化調用邏輯。
例子:默認參數¶
#include <iostream>
using namespace std;
// 給第二個參數設置默認值爲2
int power(int base, int exponent = 2) {
int result = 1;
for (int i = 0; i < exponent; i++) {
result *= base;
}
return result;
}
int main() {
cout << "3的平方:" << power(3) << endl; // 只傳一個參數,使用默認值2,結果=9
cout << "3的4次方:" << power(3, 4) << endl; // 傳兩個參數,結果=81
return 0;
}
注意:默認參數必須從右往左設置(比如exponent=2必須在base後面),否則編譯器會報錯。
函數聲明與定義順序¶
如果函數定義在調用它的代碼(比如main)之後,需要先聲明函數。函數聲明告訴編譯器“這個函數存在,返回值類型和參數列表是什麼”。
例子:函數聲明¶
#include <iostream>
using namespace std;
// 函數聲明:先告訴編譯器有這個函數
int multiply(int a, int b); // 分號結尾,不需要函數體
int main() {
int result = multiply(4, 5);
cout << "4 * 5 = " << result << endl; // 輸出:20
return 0;
}
// 函數定義:實現函數邏輯
int multiply(int a, int b) {
return a * b;
}
總結¶
- 函數定義:返回值類型+函數名+參數列表+函數體,要明確功能。
- 函數調用:用函數名+實參調用,接收返回值(無返回值用
void)。 - 參數傳遞:
- 值傳遞:形參是實參的副本,修改不影響實參。
- 引用傳遞:用
&,形參即實參,修改影響實參。 - 默認參數:簡化調用,注意從右往左設置。
練習:試着寫一個包含add(兩數相加)、swap(交換兩數)和power(計算多次冪)的小程序,熟悉函數的定義和調用!