當進行函數調用的時候,要填入與函數形式參數個數相同的實際參數,在程序運行的過程當中,實參會將參數值傳遞給形參,C++函數參數傳遞有如下三種方式。node
一. 值傳遞ios
1. 利用值傳遞方式,其實是把實參的內容複製到形參中,實參和形參是存放在兩個不一樣的內存空間中。在函數體內對形參的一切修改對實參都沒有影響函數
2. 若是形參是類的對象,利用值傳遞的話每次都要調用類的構造函數構造對象,效率比較低spa
3. 看下面這個例子指針
#include<iostream> #include<algorithm> using namespace std; class Node{ public: Node(){} private: int value; }; //形參是內置數據類型 void Fun(int a){ cout<<"形參a的地址 = "<<&a<<endl; } //形參是類的對象 void Fun(Node node){ cout<<"形參node的地址 = "<<&node<<endl; } int main(){ //內置數據類型 int a = 10; cout<<"實參a的地址 = "<<&a<<endl; Fun(a); //數據類型是類 Node node; cout<<"實參node的地址 = "<<&node<<endl; Fun(node); return 0; }
說明形參和實參確實是存放在兩個不一樣的內存單元中code
二. 指針傳遞(地址傳遞)對象
1. 當進行指針傳遞的時候,形參是指針變量,實參是一個變量的地址或者是指針變量,調用函數的時候,形參指向實參的地址。內存
2. 指針傳遞中,函數體內能夠經過形參指針改變實參地址空間的內容。get
3. 看下面例子it
//指針傳遞 void swap(int *a, int *b){ cout<<"形參指針a的地址 = "<<a<<endl; cout<<"形參指針b的地址 = "<<b<<endl; int tmp = *a; *a = *b; *b = tmp; } int main(){ int a = 5; int b = 10; cout<<"實參變量a的地址 = "<<&a<<endl; cout<<"實參變量b的地址 = "<<&b<<endl; cout<<"實參變量a的值 = "<<a<<endl; cout<<"實參變量b的值 = "<<b<<endl; //調用函數,指針傳遞方式 swap(&a, &b); cout<<"實參變量a的值 = "<<a<<endl; cout<<"實參變量b的值 = "<<b<<endl; getchar(); return 0; }
說明指針傳遞的過程當中, 確實是把實參的地址傳遞給形參,經過形參指針確實能夠更改實參指向的內存空間的值。
三. 傳遞引用
1. 引用其實是某一個變量的別名,和這個變量具備相同的內存空間。
2. 實參把變量傳遞給形參引用,至關於形參是實參變量的別名,對形參的修改都是直接修改實參。
3. 在類的成員函數中常常用到類的引用對象做爲形參,大大的提升代碼的效率
4. 看如下例子
//引用傳遞 void Fun(int &a){ cout<<"形參引用a的地址 = "<<&a<<endl; a = 100; //對形參引用進行修改 } int main(){ int a = 10; cout<<"實參a的地址 = "<<&a<<endl; cout<<"實參a的值 = "<<a<<endl; Fun(a); cout<<"實參a的值 = "<<a<<endl; getchar(); return 0; }
輸出結果
說明,形參引用的修改會直接修改實參變量的值。建議採用傳遞引用的方式