在C++中,參數傳遞的方式是“實虛結合”。
- 按值傳遞(pass by value)
- 地址傳遞(pass by pointer)
- 引用傳遞(pass by reference)
按值傳遞的過程爲:首先計算出實參表達式的值,接着給對應的形參變量分配一個存儲空間,該空間的大小等於該形參類型的,然後把以求出的實參表達式的值一一存入到形參變量分配的存儲空間中,成爲形參變量的初值,供被調用函數執行時使用。這種傳遞是把實參表達式的值傳送給對應的形參變量,故稱這種傳遞方式爲“按值傳遞”。
使用這種方式,調用函數本省不對實參進行操作,也就是說,即使形參的值在函數中發生了變化,實參的值也完全不會受到影響,仍爲調用前的值。
- /*
- pass By value
- */
- #include <iostream>
- using namespace std;
- void swap(int,int);
- int main()
- {
- int a = 3, b = 4;
- cout << "a = " << a << ", b = "
- << b << endl;
- swap(a,b);
- cout << "a = " << a << ", b = "
- << b << endl;
- return 0;
- }
- void swap(int x, int y)
- {
- int t = x;
- x = y;
- y = t;
- }
如果在函數定義時將形參說明成指針,對這樣的函數進行調用時就需要指定地址值形式的實參。這時的參數傳遞方式就是地址傳遞方式。
地址傳遞與按值傳遞的不同在於,它把實參的存儲地址傳送給對應的形參,從而使得形參指針和實參指針指向同一個地址。因此,被調用函數中對形參指針所指向的地址中內容的任何改變都會影響到實參。
- #include <iostream>
- using namespace std;
- void swap(int*,int*);
- int main()
- {
- int a = 3, b = 4;
- cout << "a = " << a << ", b = "
- << b << endl;
- swap(&a,&b);
- cout << "a = " << a << ", b = "
- << b << endl;
- system("pause");
- return 0;
- }
- void swap(int *x,int *y)
- {
- int t = *x;
- *x = *y;
- *y = t;
- }
按值傳遞方式容易理解,但形參值的改變不能對實參產生影響。
地址傳遞方式雖然可以使得形參的改變對相應的實參有效,但如果在函數中反覆利用指針進行間接訪問,會使程序容易產生錯誤且難以閱讀。
如果以引用爲參數,則既可以使得對形參的任何操作都能改變相應的數據,又使得函數調用顯得方便、自然。引用傳遞方式是在函數定義時在形參前面加上引用運算符“&”。
- #include <iostream>
- using namespace std;
- void swap(int&,int&);
- int main()
- {
- int a = 3, b = 4;
- cout << "a = " << a << ", b = "
- << b << endl;
- swap(a,b);
- cout << "a = " << a << ", b = "
- << b << endl;
- system("pause");
- return 0;
- }
- void swap(int &x,int &y)
- {
- int t = x;
- x = y;
- y = t;
- }