本文以執行個體闡述了C++中形參與實參的區別,有助於讀者加深對於C++形參與實參的認識。
形參出現在函數定義中,在整個函數體內都可以使用, 離開該函數則不能使用。實參出現在主調函數中,進入被調函數後,實參變數也不能使用。 形參和實參的功能是作資料傳送。發生函數調用時, 主調函數把實參的值傳送給被調函數的形參從而實現主調函數向被調函數的資料傳送。
1.形參變數只有在被調用時才分配記憶體單元,在調用結束時, 即刻釋放所分配的記憶體單元。因此,形參只有在函數內部有效。 函數調用結束返回主調函數後則不能再使用該形參變數。
2.實參可以是常量、變數、運算式、函數等, 無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。
3.實參和形參在數量上,類型上,順序上應嚴格一致, 否則會發生“類型不符”的錯誤。
4.函數調用中發生的資料傳送是單向的。 即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函數調用過程中,形參的值發生改變,而實參中的值不會變化。
參考如下樣本:
void Exchg1(int x, int y) { int tmp; tmp=x; x=y; y=tmp; printf("Exchg1:x=%d,y=%d\n",x,y);}void Exchg2(int &x, int &y) { int tmp; tmp=x; x=y; y=tmp; printf("Exchg2:x=%d,y=%d\n",x,y);}void Exchg3(int *x, int *y) { int tmp; tmp=*x; *x=*y; *y=tmp; printf("Exchg3:x=%d,y=%d\n",*x,*y);}void main(){ int a=4,b=6; Exchg1 (a,b) ; printf("a=%d,b=%d\n",a,b); Exchg2 (a,b); printf("a=%d,b=%d\n",a,b); Exchg3(&a,&b) ; printf("a=%d,b=%d\n",a,b);}
這裡Exchg1函數被調用的時候,並沒有成功交換a跟b的資料。為何呢。
int a=4,b=6;
Exchg1 (a,b) ; //這裡本質上發生的是:Exchg1 (intx=a,int y=b) ; x跟y是函數定義裡面的形參,也就是說這裡只是把實參a跟b的值賦予了x,y這2個形參變數。接下來,函數裡發生的值互換隻換掉了x跟y的值,而實參a跟b沒有影響。
再看Exchg2 (a,b); //再看本質Exchg2 (int &x=a,int &y=b); 這裡x跟y都是a,b的引用,操作x跟y交換就等於a跟b交換,自然,調用Exchg2 可以成功交換a跟b
Exchg3(&a,&b) ; //Exchg3(int *x=&a,int *y=&b); x跟y2個形參是a跟b的指標,也就是實參資料存放的地址。然後函數裡交換了x跟y指向的資料,也就是實參a跟b,所以,交換也是成功的。
代碼啟動並執行結果,exchg1沒有交換a,b值;exchg2交換了a,b值,到了exchg,a,b的值似乎沒有交換,仍舊是a為4,b為6,剛開始以為代碼有問題,後來設定了斷點之後,發現代碼運行到exchg3(&a,&b)時,a=6,b=4了,所以代碼運行結果和初始值一樣的話,說明已經交換了a,b的值,至此說明代碼是沒有任何問題的。