- C++面向對象程序設計
- 杜茂康等編著
- 1541字
- 2019-01-01 05:54:53
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++中,引用主要用來定義函數的參數和函數返回類型。因為引用只需要傳遞一個對象的地址,在傳遞大型對象的函數參數或從函數返回大型對象時,可以提高效率。
- 大學計算機信息技術導論
- Clojure Data Analysis Cookbook
- Dreamweaver CS3+Flash CS3+Fireworks CS3創意網站構建實例詳解
- R Data Mining
- Hands-On Artificial Intelligence on Amazon Web Services
- 大數據專業英語
- Visual C# 2008開發技術實例詳解
- 樂高創意機器人教程(中級 下冊 10~16歲) (青少年iCAN+創新創意實踐指導叢書)
- WordPress Theme Development Beginner's Guide(Third Edition)
- Photoshop CS3圖層、通道、蒙版深度剖析寶典
- 聊天機器人:入門、進階與實戰
- 單片機技術一學就會
- Dreamweaver CS6精彩網頁制作與網站建設
- 學練一本通:51單片機應用技術
- 生物3D打印:從醫療輔具制造到細胞打印