重寫的引數是形參還是實參_C++向函式傳遞引數的三種方式:傳值、指標、引用...
阿新 • • 發佈:2021-01-24
技術標籤:重寫的引數是形參還是實參
C++中,向函式傳遞引數有三種方式:
- 傳值呼叫 function call by value
- 指標呼叫 function call by pointer
- 引用呼叫 function call by reference
1、傳值呼叫
向函式傳遞引數的值,即把引數的值複製給函式的形式引數。
這種情況下,修改函式內的形式引數,並不會影響到函式外的實際引數。
#include <iostream> using namespace std; void swap_by_value(int x, int y) { int tmp = x; x = y; y = tmp; cout << "&x: " << &x << ", &y: " << &y << endl; } int main() { int a = 3; int b = 7; cout << "before: a: " << a << ", b: " << b << endl; cout << "&a: " << &a << ", &b: " << &b << endl; swap_by_value(a, b); cout << "after : a: " << a << ", b: " << b << endl; return 0; }
執行結果如下圖所示,由於形參是實參的拷貝,形參和實參的地址是不同的。因此改變形參的值,並不會影響外部實參的值。
當只在函式內部改變引數,且不希望這個改變影響外部引數時,採用值傳遞。
2、指標呼叫
向函式傳遞引數的指標,即把引數的地址複製給形式引數。
在函式內,該地址用於訪問要用到的實際引數,這意味著修改形式引數會影響實際引數。
#include <iostream> using namespace std; void swap_by_pointer(int* x, int* y) { int tmp = *x; *x = *y; *y = tmp; cout << "&x: " << x << ", &y: " << y << endl; } int main() { int a = 3; int b = 7; cout << "before: a: " << a << ", b: " << b << endl; cout << "&a: " << &a << ", &b: " << &b << endl; swap_by_pointer(&a, &b); cout << "after : a: " << a << ", b: " << b << endl; return 0; }
執行結果如下圖所示,形參為指向實參地址的指標,因此對形參的指向操作,就相當於對實參本身進行操作。
3、引用呼叫
向函式傳遞引數的引用,即把引用的地址複製給形式引數。
在函式內,該引用用於訪問要用到的實際引數,這也意味著修改形式引數會影響實際引數。
#include <iostream> using namespace std; void swap_by_reference(int& x, int& y) { int tmp = x; x = y; y = tmp; cout << "&x: " << &x << ", &y: " << &y << endl; } int main() { int a = 3; int b = 7; cout << "before: a: " << a << ", b: " << b << endl; cout << "&a: " << &a << ", &b: " << &b << endl; swap_by_reference(a, b); cout << "after : a: " << a << ", b: " << b << endl; return 0; }
執行結果如下圖所示,形參相當於是實參的“別名”,兩者的地址是相同的,因此對形參的操作其實就是對實參的操作。
指標傳遞和引用傳遞常用於當一個函式實際需要返回多個值時,可以將需要返回的變數以指標或引用的方式傳遞給函式。