C++函數參照傳遞(超詳細)

2020-07-16 10:04:35
前面講過,實參通常是通過值傳遞給函數的,這意味著形參接收的只是傳送給它們的值的副本,它們儲存在函數的本地記憶體中。對形參值進行的任何更改都不會影響原始實參的值。

然而,有時候可能會希望一個函數能夠改變正在呼叫中的函數(即呼叫它的函數)中的一個值,這可以通過參照傳遞的方式來完成。

我們知道,變數是可以儲存資料的記憶體位置的名稱。當使用變數時,實際上就是存取儲存在分配給它的記憶體位置的資料。參照變數是變數的另一個別名,它沒有自己的儲存資料的記憶體位置,它存取的是另一個變數的記憶體位置。對參照變數作出的任何更改,實際上都是對它所參照的變數記憶體位置中儲存資料的更改。

當使用參照變數作為形參時,它將變為實參列表中相應變數的別名,對形參進行的任何更改都將真正更改正在呼叫它的函數中的變數。當以這種方式將資料傳遞給形參時,該實參被稱為按參照傳遞

參照變數的定義方法和常規變數類似,但是其資料型別和名稱之間有一個 & 符號。例如,以下函數定義使形參 refVar 成為參照變數:
void doubleNum(int& refVar)
{
    refVar *= 2;
}
注意,變數 refVar 被稱為“對 int 的參照”。

該函數將 refVar 乘以 2,因為 refVar 是參照變數,所以該操作實際上將對作為實參傳遞給函數的變數執行。

具有參照形參的函數的原型也必須具有 & 符號。與函數頭一樣,它在資料型別和變數名之間。如果原型中省略了變數名,那麼 & 符號將跟在資料型別後面。以下所有 doubleNum 函數的原型都是正確的:

void doubleNum(int &refVar);
void doubleNum(int& refVar);
void doubleNum(int &);
void doubleNum(int&);

注意,& 符號必須出現在使用參照變數作為形參的任何函數的原型和函數頭中。它不會出現在函數呼叫中。

下面的程式演示了參照變數形參的應用:
#include <iostream>
using namespace std;

// Function prototype. The parameter is a reference variable.
void doubleNum(int SrefVar);

int main()
{
    int value = 4;
    cout << "In main, value is " << value << endl;
    cout << "Now calling doubleNum..." << endl;
    doubleNum(value);
    cout << "Now back in main, value is "<< value << endl;
    return 0;
}
void doubleNum (int SrefVar)
{
    refVar *= 2;
}
程式輸出結果:

In main, value is 4
Now calling doubleNum...
Now back in main, value is 8

此程式中的形參 refVar “指向”函數 main 中的 value 變數。當程式使用一個參照變數時,它實際上是使用它所參照或指向的變數,如圖 1 所示。

引用變量實際上指向的是被它引用的變量
圖 1 參照變數實際上指向的是被它參照的變數