【C++】引用作爲函數參數

C++中,引用作爲函數參數

引用作爲函數參數

C++之所以增加引用類型, 主要是把它作爲函數參數,以擴充函數傳遞數據的功能。

————————————————————

c++,函數傳參:
(1)將變量名作爲實參和形參。這時傳給形參的是變量的值,傳遞是單向的。如果在執行函數期間形參的值發生變化,並不傳回給實參。因爲在調用函數時,形參和實參不是同一個存儲單元。//同c


(2) 傳遞變量的指針。形參是指針變量,實參是一個變量的地址,調用函數時,形參(指針變量)指向實參變量單元。這種通過形參指針可以改變實參的值。//同c


(3) C++提供了 傳遞變量的引用。形參是引用變量,和實參是一個變量,調用函數時,形參(引用變量)指向實參變量單元。這種通過形參引用可以改變實參的值。

 

#include <iostream>
using namespace std;
void funcr(int &num , int x)
{
    cout<<"in funcr,addr is:"<<&num<<endl;//對比地址,等於原地址
    num = x ;//會改變傳入參數的值。 
}

void func(int num , int x)//不能寫成void funcr(int num , int x),不正確的重載,導致不知道該調用誰。
{
    cout<<"in func,addr is:"<<&num<<endl;//對比地址,有所變化
    num = x ;//只會在函數內改變拷貝變量的值,不會改變傳入的參數值
} 

int main() {
    int x = 100;
    int &rx = x ;
    cout<<"addr_x:"<<&x<<endl;
    cout<<"addr_rx:"<<&rx<<endl;//變量地址和它的引用地址相同


    funcr(x,177);//改變傳入參數的值,不管代碼中傳的是變量本身還是引用   
    cout<<"after funcr , x="<<x<<endl;

    funcr(rx,211);  //改變傳入參數的值          
    cout<<"after funcr , rx="<<x<<endl;

    func (rx,233); //不會改變傳入參數的值,不管代碼中傳的是變量本身還是引用                 
    cout<<"after func , rx="<<x<<endl;

    while(1);
    return 0 ;
} 
結果:
addr_x:0xbf82293c
addr_rx:0xbf82293c
in funcr,addr is:0xbf82293c
after funcr , x=177
in funcr,addr is:0xbf82293c
after funcr , rx=211
in func,addr is:0xbf822920
after func , rx=211

 

1.值傳遞:有一個形參向函數所屬的棧拷貝數據的過程,如果值傳遞的對象是類對象或是大的結構體對象,將耗費一定的時間和空間。

2.指針傳遞:同樣有一個形參向函數所屬的棧拷貝數據的過程,但拷貝的數據是一個固定爲4字節的地址。

3.引用傳遞:同樣有上述的數據拷貝過程,但其是針對地址的,相當於爲該數據所在的地址起了一個別名。

效率上講,指針傳遞和引用傳遞比值傳遞效率高。一般主張使用引用傳遞,代碼邏輯上更加緊湊、清晰。

引用傳遞做函數參數”是C++的特性,C語言不支持。

例如:數據結構帶&與不帶&

帶&的是引用型參數,它是地址傳遞,其實參會隨着形參的改變而改變;不帶&的參數是一般參數,是值傳遞,其實參不會隨着形參的改變而改變。所以,結構改變,並且需要傳回這種改變的要用引用型參數,否則用一般參數。GetElem(L,i)只是找到第i個元素的值,線性表的結構並未發生任何改變,所以參數L前面不用加&。ListInsert(&L,i,e)是在線性表L的第i個元素處插入一個數值爲e的元素,線性表L的結構發生了改變,長度增加了,所以在L前必須加上&。如果不加,顯示L時,新增元素就顯示不出來,顯示L的長度,也仍然是增加以前的值,比實際長度少1.

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章