官术网_书友最值得收藏!

icon2

1.5 引用

1.引用是什么

對于習慣使用C語言進行開發的朋友們,在看到C++中出現的&符號后,可能會犯迷糊,雖然在C語言中這個符號代表取地址符,但是在C++中它卻有著不一樣的用途,代表著引用的意思。掌握C++的&符號,有利于增強代碼質量和提高代碼執行效率。

引用是一種變量類型,它用于為一個變量起一個別名。

引用的聲明方法是:


類型標識符 &引用名=目標變量名;

假設有一個變量a,想給它起一個別名r,可以這樣寫:


int a;
int &r=a;

定義引用r,它是變量a的引用,即別名。經過這樣的聲明后,a和r的作用都一樣,都代表著同一變量。a和r占用內存的同一個存儲單元,即具有同一地址。在聲明一個引用變量時,必須同時使之初始化,即聲明它代表哪個變量。函數執行期間,不可以將其再作為其他變量的引用。例1.9說明了引用的使用方法。

【例1.9】 引用的使用舉例。


#include<iostream>
using namespace std;
int main(){
    int a=2;
    int &r=a;
    a=a+4;
    cout<<a<<" "<<r<<endl;     // 因為ar的值會同時變化,所以ar的值都是6
    r=10;
    cout<<a<<" "<<r<<endl;     // r變了,a也會變,所以ar的值都是10
    return 0;
}

程序的執行結果是:


6 6
10 10

例1.9中展示了引用與變量的關系。r是a的引用,a變了,r的值也跟著變;r變了,a的值也跟著變。

2.引用作為參數

引用一個重要的作用就是作為函數的參數。

【例1.10】 引用作為函數的參數舉例。


#include<iostream>
using namespace std;
void Mmin1(int a,int b){
    int temp;
    if(a>b){
        temp=a;
        a=b;
        b=temp;
    }
}
void Mmin2(int &a,int &b){          // 引用作為函數的參數
    int temp;
    if(a>b){
        temp=a;
        a=b;
        b=temp;
    }
}
int main(){
    int a=30,b=20;
    Mmin1(a,b);                    // 
    cout<<a<<" "<<b<<endl;          // ab的值保持不變。
    Mmin2(a,b);
    cout<<a<<" "<<b<<endl;          // a的值是20b的值是30. ab的值被修改了
    return 0;
}

程序的執行結果是:


30 20
20 30

例1.10中定義了兩個求最小值的函數,其中Mmin1是將一般變量作為函數的參數,Mmin2則是將引用作為函數的參數。

將一般變量作為函數的參數,傳給形參的是變量的值,傳遞是單向的。如果在執行函數期間形參的值發生變化,并不傳回給實參。因為在調用函數時,形參和實參不是同一個存儲單元。

使用引用傳遞函數的參數時,在內存中并沒有產生實參的副本,而是對實參直接操作。當使用一般變量傳遞函數的參數時,當函數發生調用,需要給形參分配存儲單元,形參變量是實參變量的副本;如果傳遞的是對象,還將調用拷貝構造函數。因此,當參數傳遞的數據較大時,用引用比用一般變量傳遞參數的效率更高,所占空間更少。

使用指針作為函數的參數雖然也能達到與使用引用同樣的效果,但是在被調函數中同樣要給形參分配存儲單元,且需要重復使用“*指針變量名”的形式進行運算,這很容易產生錯誤且程序的閱讀性較差;另一方面,在主調函數的調用點處,必須用變量的地址作為實參,這些都不太方便。

綜上所述,引用是個有效率的選擇。

3.常引用

如果既要提高程序的效率,又要使傳遞給函數的數據不在函數中被改變,就應該使用常引用。常引用的聲明方式是:


const 類型標識符 &引用名=目標變量名;

用這種方式聲明的引用,不能通過引用對目標變量的值進行修改,在程序中使引用的目標成為const類型,從而保證了引用的安全性,如下所示:


int a;
const int &r=a;
r=1;          // 錯誤
a=1;          // 正確

假設有如下函數聲明:


string func1();
void func2(string &s);

那么下面的表達式都是非法的:


func2(func1);
func2("hello");

原因在于func1()和"hello"都將產生一個臨時對象,而在C++中,這些臨時對象都是const類型的。因此,上面的表達式就是試圖將一個const類型的對象轉化為非const類型,這是非法的。

引用型參數應該在能被定義成const的情況下,盡量定義為const。

主站蜘蛛池模板: 英德市| 称多县| 毕节市| 枞阳县| 仁布县| 江西省| 青河县| 青神县| 乌什县| 克什克腾旗| 河津市| 青岛市| 宜昌市| 图们市| 基隆市| 阿克陶县| 新乡市| 临城县| 三都| 武宣县| 乌拉特中旗| 察雅县| 达孜县| 祁连县| 莱阳市| 九龙县| 陇南市| 南澳县| 秭归县| 璧山县| 贵州省| 综艺| 峨山| 南投县| 巩义市| 门头沟区| 奇台县| 芮城县| 巧家县| 阿鲁科尔沁旗| 九龙坡区|