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

2.4 引用

引用是某個對象(即變量)的別名,即某個對象的替代名稱(相當一個人的第二名稱)。在C語言中沒有引用這一概念,它是C++引入的新概念。引用由符號&引導定義,形式如下:

類型 &引用名=變量名;

例如:

int i=9;      //L1
int &ir=i;     //L2

語句L2定義ir為i的別名,相當于i還有一個名字叫ir。對ir的操作就是對i的操作。

例2-5】 引用的簡單例子。

//Eg2-5.cpp
#include<iostream.h>
void main(){
    int i=9;
    int& ir=i;
    cout<<"i= "<<i<<"  "<<"ir="<<ir<<endl;
    ir=20;
    cout<<"i="<<i<<"  "<<"ir="<<ir<<endl;
    i=12;
    cout<<"i="<<i<<"  "<<"ir="<<ir<<endl;
    cout<<"i的地址是:"<<&i<<endl;
    cout<<"ir的地址是:"<<&ir<<endl;
}

本程序的運行結果如下:

i= 9  ir=9
i=20  ir=20
i=12  ir=12
i的地址是:0x0012FF34
ir的地址是:0x0012FF34

從結果可以看出,ir和i其實是同一內存變量,對ir的操作實際就是對i的操作。

使用引用時需要注意以下幾個問題:① 在定義引用時,引用符&與指針運算符一樣,在類型和引用名之間的位置是靈活的,以下幾種定義完全相同。

int& ir=i; int & ir=i; int &ir=i;

② 在變量聲明時出現的&才是引用運算符(包括函數參數聲明和函數返回類型的聲明),其他地方出現的&都是地址操作符。

int i;
int &r=i;           //引用
int& f(int &i1,int &);    //引用參數,函數返回引用
int *p=&i;           //&取i的地址
cout<<&p;          //&取p的地址
cout<<&i;           //&取i的地址

③ 引用必須在定義時初始化,不能在定義完成后再給它賦值,為引用提供的初始值,可以是一個變量,也可以是另一個引用名;同一個變量可以定義多個引用。

float f;       //L1
float &fr;      //L2,錯誤,fr未初始化
float &r1=f;     //L3
float &r2=f;     //L4
float &r3=r1;     //L5

這樣定義后,r1、r2、r3都是f的別名,對它們的任何運算都是對f的運算。

④ 引用實際是一種隱式指針,但它與指針的用法存在區別。

例2-6】 引用與指針的區別。

//Eg2-6.cpp
void main(){
    int i=9;     //L1
    int *pi=&i;    //L2
    int &ir=i;    //L3
    *pi=2;      //L4
    ir=8;       //L5
}

語句L1、L2、L3定義的變量情形如下所示:

pi是指針,ir是引用。語句L4是指針的解引用形式,把i所對應的內存值改為2。語句L5是引用的使用形式,把i對應的內存值改為8。

雖然引用實質上也是一種指針,但它與指針至少存在兩點區別:? 指針必須通過解引用運算符“*”才能訪問它所指向的內存單元,而引用不需要通過“*”就能夠訪問它所代表的內存單元,與普通變量的訪問方法差不多;? 指針是一個變量,可以對它重新賦值,讓它指向另外的地址,但引用必須在定義時進行初始化,并且一經定義就再也不能作為其他變量的引用了。

⑤ 當用&運算符獲取一個引用的地址時,實際取出的是引用對應的變量的地址。例如:

int i=9;
int &ir=i;
int *pi=&ir;

pi實際指向的是i,因為ir是i的別名,所以&ir將獲得i的內存地址。

⑥ 建立引用時,需要注意以下3個限制:不能建立引用的引用;不能建立引用數組,也不能建立數組的引用;可以建立指針的引用,但不能創建指向引用的指針。例如:

int i=0,a[10];
int &aa=a;     //錯誤,aa是數組的引用
int &ia[5];    //錯誤,ia是引用數組
int &*ip=i;     //錯誤,ip是指向引用的指針
int &&ii=i;     //錯誤,ii是引用的引用
int *pi=&i;
int *&pr=pi;    //正確,pr是指針的引用

⑦ 引用與左值。對于每個變量,都有兩個與它相關聯的值:左值和右值。左值是指變量對應的那塊內存區域的地址,是可以“放在賦值符號左邊的值”;右值是指變量對應的內存區域中存儲的數據值,是可以“放在賦值符號右邊的值”。

一般地,賦值語句的左邊必須是一個左值。當一個變量名放在賦值語句的左邊時,是對它的左值進行操作,即修改它對應的內存區域中的值;當變量放于賦值句的右邊或表達式中時,操作的是它的右值,即讀取變量對應的內存單元中的值進行相關運算。

常量、表達式都僅是一個右值,所以不能把它們放在賦值句的左邊。例如:

int i=1;
i=i+10;      //L1
i+10=i;      //L2,錯誤,i+10是一個右值,不能放在=的左邊
i=10;
10=i;       //L3,錯誤,右值不能放在=的左邊

語句L1盡管在“=”的兩邊都有i,但它們是有區別的。“=”左邊取的是i的內存地址(左值),右邊取的是i在對應內存中的值1(右值)。

引用是一個左值。也就是說,引用一定與某塊內存區域相對應,能夠放在賦值符“=”的左邊。在C++中,引用主要用來定義函數的參數和函數返回類型。因為引用只需要傳遞一個對象的地址,在傳遞大型對象的函數參數或從函數返回大型對象時,可以提高效率。

主站蜘蛛池模板: 嫩江县| 平邑县| 化州市| 雅安市| 纳雍县| 纳雍县| 祁门县| 隆化县| 建瓯市| 布拖县| 奈曼旗| 神农架林区| 衡阳市| 庄河市| 石渠县| 德安县| 青阳县| 宁波市| 永丰县| 黄浦区| 赤峰市| 尖扎县| 临桂县| 淳安县| 安西县| 金堂县| 桦川县| 贡山| 同德县| 武乡县| 大化| 贵德县| 苍山县| 栾城县| 习水县| 兴国县| 都兰县| 龙口市| 佛坪县| 吉林市| 名山县|