有了變數名,為什麼還需要乙個別名呢?c++之所以增加引用型別, 主要是把它作為函式引數,以擴充函式傳遞資料的功能。
到目前為止我們介紹過函式引數傳遞的兩種情況。
1) 將變數名作為實參和形參
這時傳給形參程式設計客棧的是變數的值,傳遞是單向的。如果在執行函式期間形參的值發生變化,並不傳回給實參。因為在呼叫函式時,形參和實參不是同乙個儲存單元。
【例】要求將變數i和j的值互換。下面的程式無法實現此要求。
#include
using namespace std;
int main( )
執行時輸出3 5i和j的值並未互換。
為了解決這個問題,採用傳遞變數位址的方法。
2) 傳遞變數的指標
形參是指標變數,實參是乙個變數的位址,呼叫函式時,形參(指標變數)指向實參變數單元。程式見例6.19。
【例】使用指標變數www.cppcns.com作形參,實現兩個變數的值互換。
#include
using namespace std;
int main( )
形參與實參的結合見圖示意。
這種虛實結合的方法仍然是「值傳遞」方式,只是實參的值是變數的位址而已。通過形參指標變數訪問主函式中的變數(i和j),並改變它們的值。這樣就能得到正確結果,但是在概念上卻是兜了乙個圈子,不那麼直截了當。
在pascal語言中有「值形參」和「變數形參」(即var形參),對應兩種不同的傳遞方式,前者採用值傳遞方式,後者採用位址傳遞方式。在c語言中,只有「值形參」而無「變數形參」,全部採用值傳遞方式。c++把引用型變數作為函式形參,就彌補了這個不足。
c++提供了向函式傳遞資料的第(3)種方法,即傳送變數的別名。
【例】利用「引用形參」實現兩個變數的值互換。
#include
using namespace std;
int main( )
void change (int &x,int &y) //使x和y互換
運**況如下:
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<
本文標題: c++程式設計中將引用型別作為函式引數的方法指南
本文位址:
C 引用型別作為函式引數時
在 本文的主題之前,先來介紹下c 中的值型別和引用型別 眾所周知c 中有值型別和引用型別,值型別有基礎資料型別 諸如int,double,bool等 結構體 列舉,引用型別有介面 類 委託。值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這...
C 引用型別作為函式引數時
在 本文的主題之前,先來介紹下c 中的值型別和引用型別 眾所周知c 中有值型別和引用型別,值型別有基礎資料型別 諸如int,double,bool等 結構體 列舉,引用型別有介面 類 委託。值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這...
C 引用型別作為函式引數時
在 本文的主題之前,先來介紹下c 中的值型別和引用型別 眾所周知c 中有值型別和引用型別,值型別有基礎資料型別 諸如int,double,bool等 結構體 列舉,引用型別有介面 類 委託。值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這...