參數傳值
在 C++ 中,函數參數的傳遞有兩種方式:傳值和傳引用。在函數的形參不是引用的情況下,參數傳遞方式是傳值的。傳引用的方式要求函數的形參是引用。
“傳值”是指,函數的形參是實參的一個拷貝,在函數執行的過程中,形參的改變不會影響實參。例如下面的程序:
#include <iostream>
using namespace std; void Swap(int a, int b) { int tmp; //以下三行將a、b值互換 tmp = a; a = b; b = tmp; cout << "In Swap: a = " << a << " b = " << b << endl; } int main() { int a = 4, b = 5; Swap(a, b); cout << "After swaping: a = " << a << " b = " << b << endl; return 0; }
在上面的程序中,Swap 函數的返回值類型是 void,因此函數體內可以不寫 return 語句。 在不寫 return 語句的情況下,函數執行到末尾的}
才返回。
上面程序的輸出結果是:
In Swap: a = 5 b = 4
After swaping: a = 4 b = 5
輸出結果說明,在 Swap 函數內部,形參 a、b 的值確實發生了互換,但是在 main 函數中, a、b 還是維持原來的值。也就是說,形參的改變不會影響實參。這是因為,形參和實參存放在不同的內存空間中。
一個程序在運行時,其所占用的內存空間有一部分被稱作“棧”,當一個函數被調用時,在“棧”中就會分配出一塊新的存儲空間,用來存放形參和函數中定義的變量(也稱為局部變量,如上面程序中的 tmp)。實參的值會被復制到棧中存放對應形參的地方,因此形參的值才等於實參。函數執行過程中對形參的修改,相當於只是修改了實參的一個拷貝,因此不會影響實參。
參數傳引用
如果函數的形參是引用,那么參數的傳遞方式就是傳引用的。在傳引用方式下,形參是對應的實參的引用。也就是說,形參和對應的實參是一回事,形參的改變會影響實參。
有了引用的概念,交換兩個變量的 Swap 函數可以如下編寫
#include<iostream>
using namespace std; void Swap(int & a, int & b) { //交換a、b的值 cout << a <<" "<< b << endl; //輸出 100 50 int tmp; tmp = a; a = b; b = tmp; cout << a <<" "<< b << endl; //輸出 50 100 } int main() { int n1 = 100, n2 = 50; Swap(n1, n2); //n1、n2 的值被交換 cout << n1 << " " << n2 << endl; //輸出 50 100 }
第 11 行,進入 Swap 函數后,a 引用了 n1,b 引用了 n2,a、b 值的改變會導致 n1、n2 值的改變。因此本行會使 n1 和 n2 的值交換
常引用
定義引用時,可以在前面加 const 關鍵字,則該引用就成為“常引用”。如:
int n; const int & r = n;
常引用和普通引用的區別在於:不能通過常引用去修改其引用的內容。注意,不是常引用所引用的內容不能被修改,只是不能通過常引用去修改而已,但可以用別的辦法修改。例如下面的程序片段:
int n = 100; const int & r = n; //error: C++ requires a type specifier for all declarations r = 200; //編譯出錯,不能通過常引用修改其引用的內容 n = 300; //沒問題,n的值變為300
http://c.biancheng.net/view/195.html