參數的傳值、傳參考


C++在呼叫函式時的參數傳遞方式主要有兩種:傳值(Pass by value)、傳參考(Pass by reference)。

參數傳遞時的傳值就是傳送(變數)值給函式上對應的參數,值被複製一份給參數,傳遞者與接受者兩個變數彼此各佔有一個記憶體,互不相干,例如:
int main() {
    int x = 10;
    ....
    cout << increment(x) << endl;
    cout << x << endl;

    return 0;
}

int increment(int n) {
    n = n + 1;
    return n;
}

在這個程式片段中,x將值傳遞給increment()函式的參數n,n雖然作了遞增運算,但是對x的儲存值並無影響,x最後仍是顯示10。

在傳值應用上,您也可以將變數的記憶體位址值取出,傳遞給指定的指標參數,只要使用&運算子就可以了。
int main() {
    int x = 10;
    ....
    cout << increment(&x) << endl;
    cout << x << endl;

    return 0;
}

int increment(int *n) {
    *n = *n + 1;
    return *n;
}

在這個程式中,increment()上的參數n是個指標,在呼叫increment()函式時,您使用取址運算子&將x變數的記憶體位 址取出並 傳遞給指標n,而在函式中,您使用取值運算子*取出這塊記憶體位址的值,並作遞增動作之後再指定回該記憶體位址,所以程式最後的x變數會顯示值11。

在函式上宣告指標參數的目的,通常目的是若作為引數的變數值同一位址上,在函式中若有變動該位址上的值時,呼叫者也可以保留這份變動的結果,這可以解決一 個問題,在C++中我們在呼叫函式後只能傳回 (return)一個值,若在呼叫函式時,您希望能取得兩個以上的運算結果,就可以使用指標參數。

參考(Reference) 中介紹過參考型態,參考型態最常使用於函式的參數列上,一個使用的例子如下:
int main() {
    int x = 10;
    ....
    cout << increment(x) << "\n";
    cout << x << "\n";

    return 0;
}

int increment(int &n) {
    n = n + 1;
    return n;
}

在上面的程式片段中,您在increment()的參數列中使用參考宣告int&,當呼叫increment()函式時,您不用使用 &運 算子取得x變數的記憶體位址,n會自動參考至x變數的位址,由於x變數與n變數的記憶體位址是相同的,所以在increment()中的遞增動作,同樣會 影響x變數,所以程式最後x會顯示為11。

傳參考使用的時機使在於您希望傳遞的參數,在函式中若有變動時,呼叫者也可以保留這份變動的結果,所以若在呼叫函式時,您希望能取得兩個以上的運算結果, 就可以使用傳址呼叫,另一個使用的時機則是在大型物件的傳遞,如果使用傳值呼叫,大型物件在複製時會佔用一塊大的記憶體,此時您可以使用傳參考,如果您不 想在函式中改變物件的話,而只想讓物件提供資訊,則可以加上const修飾,例如:
void someFunction(const SomeType &some) {
    ....
}