C++編程中將援用類型作為函數參數的辦法指南。本站提示廣大學習愛好者:(C++編程中將援用類型作為函數參數的辦法指南)文章只能為提供參考,不一定能成為您想要的結果。以下是C++編程中將援用類型作為函數參數的辦法指南正文
有了變量名,為何還須要一個體名呢?C++之所以增長援用類型, 重要是把它作為函數參數,以擴大函數傳遞數據的功效。
到今朝為止我們引見過函數參數傳遞的兩種情形。
1) 將變量名作為實參和形參
這時候傳給形參的是變量的值,傳遞是單向的。假如在履行函數時代形參的值產生變更,其實不傳回給實參。由於在挪用函數時,形參和實參不是統一個存儲單位。
【例】請求將變量i和j的值交換。上面的法式沒法完成此請求。
#include <iostream> using namespace std; int main( ) { void swap(int,int); //函數聲明 int i=3,j=5; swap(i,j); //挪用函數swap cout<<i<<" "<<j<<endl; //i和j的值未交換 return 0; } void swap(int a,int b) //妄圖經由過程形參a和b的值交換,完成實參i和j的值交換 { int temp; temp=a; //以下3行用來完成a和b的值交換 a=b; b=temp; }
運轉時輸入3 5i和j的值並未交換。
為懂得決這個成績,采取傳遞變量地址的辦法。
2) 傳遞變量的指針
形參是指針變量,實參是一個變量的地址,挪用函數時,形參(指針變量)指向實參變量單位。法式見例6.19。
【例】應用指針變量作形參,完成兩個變量的值交換。
#include <iostream> using namespace std; int main( ) { void swap(int *,int *); int i=3,j=5; swap(&i,&j); //實參是變量的地址 cout<<i<<" "<<j<<endl; //i和j的值已交換 return 0; } void swap(int *p1,int *p2) //形參是指針變量 { int temp; temp=*p1; //以下3行用來完成i和j的值交換 *p1=*p2; *p2=temp; }
形介入實參的聯合見圖表示。
這類真假聯合的辦法依然是“值傳遞”方法,只是實參的值是變量的地址罷了。經由過程形參指針變量拜訪主函數中的變量(i和j),並轉變它們的值。如許就可以獲得准確成果,然則在概念上倒是兜了一個圈子,不那末直接了當。
在Pascal說話中有“值形參”和“變量形參”(即var形參),對應兩種分歧的傳遞方法,前者采取值傳遞方法,後者采取地址傳遞方法。在C說話中,只要“值形參”而無“變量形參”,全體采取值傳遞方法。C++把援用型變量作為函數形參,就填補了這個缺乏。
C++供給了向函數傳遞數據的第(3)種辦法,即傳送變量的別號。
【例】應用“援用形參”完成兩個變量的值交換。
#include <iostream> using namespace std; int main( ) { void swap(int &,int &); int i=3,j=5; swap(i,j); cout<<"i="<<i<<" "<<"j="<<j<<endl; return 0; } void swap(int &a,int &b) //形參是援用類型 { int temp; temp=a; a=b; b=temp; }
輸入成果為:
i=5 j=3
在swap函數的形參表列中聲明a和b 是整型變量的援用。
現實上,在真假聯合時是把實參i的地址傳到形參a,使形參a的地址取實參i的地址,從而使a和i同享統一單位。異樣,將實參j的地址傳到形參b,使形參b的地址取實參j的地址,從而使b和j同享統一單位。這就是地址傳遞方法。為便於懂得,可以淺顯地說:把變量i的名字傳給援用變量a,使a成為i的別號。
請思慮:這類傳遞方法和應用指針變量作形參時有何分歧?可以發明:應用援用類型就不用在swap函數中聲明形參是指針變量。指針變量要別的開拓內存單位,其內容是地址。而援用變量不是一個自力的變量,不零丁占內存單位,在例中援用變量a和b的值的數據類型與實參雷同,都是整型。
在main函數中挪用swap函數時,實參不用用變量的地址(在變量名的後面加&),而直接用變量名。體系向形參傳送的是實參的地址而不是實參的值。
這類傳遞方法相當於Pascal說話中的“變量形參”,明顯,這類用法比應用指針變量簡略、直不雅、便利。應用變量的援用,可以部門取代指針的操作。有些曩昔只能用指針來處置的成績,如今可以用援用來取代,從而下降了法式設計的難度。
【例】對3個變量按由小到年夜的次序排序。
#include <iostream> using namespace std; int main( ) { void sort(int &,int &,int &); //函數聲明,形參是援用類型 int a,b,c; //a,b,c是需排序的變量 int a1,b1,c1; //a1,b1,c1終究的值是已排好序的數列 cout<<"Please enter 3 integers:"; cin>>a>>b>>c; //輸出a,b,c a1=a;b1=b;c1=c; sort(a1,b1,c1); //挪用sort函數,以a1,b1,c1為實參 cout<<"sorted order is "<<a1<<" "<<b1<<" "<<c1<<endl; //此時a1,b1,c1已排好序 return 0; } void sort(int &i,int &j,int &k) //對i,j,k 3個數排序 { void change(int &,int &); //函數聲明,形參是援用類型 if (i>j) change (i,j); //使i<=j if (i>k) change (i,k); //使i<=k if (j>k) change (j,k); //使j<=k } void change (int &x,int &y) //使x和y交換 { int temp; temp=x; x=y; y=temp; }
運轉情形以下:
Please enter 3 integers:23 12 -345↙ sorted order is -345 12 23
可以看到:這個法式很輕易懂得,不容易失足。因為在挪用sort函數時真假聯合使形參i,j,k成為實參a1,b1,c1的援用,是以經由過程挪用函數sort(a1, b1, c1)既完成了對i,j,k排序,也就同時完成了對a1,b1,c1排序。異樣,履行change (i, j)函數,可以完成對實參i和j的交換。
援用不只可以用於變量,也能夠用於對象。例照實參可所以一個對象名,在真假聯合時傳遞對象的肇端地址。這會在今後引見。
當看到&a如許的情勢時,如何差別是聲明援用變量照樣取地址的操作呢?當&a的後面有類型符時(如int &a),它必定是對援用的聲明;假如後面無類型符(如cout<<&a),則是取變量的地址。