新手入門C++函數:定義、調用與參數傳遞

什麼是函數?

在編程中,函數就像一個“代碼小工具”,它把一段特定功能的代碼封裝起來,讓我們可以重複使用。比如數學中的函數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;
}

爲什麼? 因爲值傳遞是“複製實參的值給形參”,相當於函數里的ax的一個“副本”,修改ax無關。

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(計算多次冪)的小程序,熟悉函數的定義和調用!

小夜