C++按值傳遞詳解

2020-07-16 10:04:40
我們知道,形參是在函數定義的括號內定義的專用變數,它們的目的是儲存按實參傳遞給它們的資訊,實參被列在函數呼叫語句的括號內。

通常,當資訊被傳遞給一個函數時,採用按值傳遞的方式,這意味著形參接收的是傳遞給它的值的副本。如果形參的值在函數內部被改變,那麼它對原始實參是沒有影響的。下面的程式演示了這個概念。
#include <iostream>
using namespace std;

// Function Prototype
void changeMe(int aValue);

int main()
{
    int number = 12;
    // Display the value in number
    cout << "In main number is " << number << endl;
    //Call changeMe, passing the value in number as an argument
    changeMe(number);
    // Display the value in number again
    cout << "Back in main again, number is still " << number << endl;
    return 0;
}

void changeMe(int myValue)
{
    //Change the value of myValue to 0
    myValue = 0;
    //Display the value in myValue
    cout << "In changeMe, the value has been changed to " << myValue << endl;
}
程式輸出結果:

In main number is 12
In changeMe, the value has been changed to 0
Back in main again, number is still 12

通過分析此程式,我們還能得出這樣的結論,當函數原型列出變數名稱和資料型別時,它使用的名稱只是虛擬名稱,編譯器實際上並不使用它們,並且不必在函數頭中使用一致的名稱。第 5 行中的 changeMe 函數原型和第 19 行中的 changeMe 函數頭都指定該函數具有一個 int 形參,但它們使用了不同的名稱。

並且,即使在 changeMe 函數中形參變數 myValue 已更改,實參 number 也不會被修改。這是因為 myValue 變數只包含了 number 變數的副本。只是這個副本被改變,而不是原來的。changeMe 函數無法存取原始實參。圖 1 說明了形參變數在記憶體中的儲存位置與原始實參的儲存位置是分開的。


圖 1 原始實參和函數形參在記憶體中是分開儲存的