對於習慣使用c進行開發的朋友們,在看到c++中出現的&符號,可能會犯迷糊,因為在c語言中這個符號表示了取位址符,但是在c++中它卻有著不同的用途,掌握c++的&符號,是提高**執行效率和增強**質量的乙個很好的辦法。
引用是c++引入的新語言特性,是c++常用的乙個重要內容之一,正確、靈活地使用引用,可以使程式簡潔、高效。我在工作中發現,許多人使用它僅僅 是想當然,在某些微妙的場合,很容易出錯,究其原由,大多因為沒有搞清本源。故在本篇中我將對引用進行詳細討論,希望對大家更好地理解和使用引用起到拋磚 引玉的作用。
一、引用簡介
引用就是某一變數(目標)的乙個別名,對引用的操作與對變數直接操作完全一樣。
引用的宣告方法:型別識別符號 &引用名=目標變數名;
【例1】:int a; int &ra=a; //定義引用ra,它是變數a的引用,即別名
說明:(1)&在此不是求位址運算,而是起標識作用。
(2)型別識別符號是指目標變數的型別。
(3)宣告引用時,必須同時對其進行初始化。
(4)引用宣告完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變數名的別名。
ra=1; 等價於 a=1;
(5)宣告乙個引用,不是新定義了乙個變數,它只表示該引用名是目標變數名的乙個別名,它本身不是一種資料型別,引用本身也會佔儲存單元,系統也給引用分配儲存單元。故:對引用求位址,就是對目標變數求位址。&ra與&a相等。
(6)不能建立陣列的引用。因為陣列是乙個由若干個元素所組成的集合,所以無法建立乙個陣列的別名。
二、引用應用
1、引用作為引數
引用的乙個重要作用就是作為函式的引數。以前的c語言中函式引數傳遞是值傳遞,如果有大塊資料作為引數傳遞的時候,採用的方案往往是指標,因為 這樣可以避免將整塊資料全部壓棧,可以提高程式的效率。但是現在(c++中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引 用。
【例2】:
void swap(int &p1, int &p2) //此處函式的形參p1, p2都是引用
為在程式中呼叫該函式,則相應的主調函式的呼叫點處,直接以變數作為實參進行呼叫即可,而不需要實參變數有任何的特殊要求。如:對應上面定義的swap函式,相應的主調函式可寫為:
main( )
說明:(1)以引用返回函式值,定義函式時需要在函式名前加&
(2)用引用返回乙個函式值的最大好處是,在記憶體中不產生被返回值的副本。
【例5】以下程式中定義了乙個普通的函式fn1(它用返回值的方法返回函式值),另外乙個函式fn2,它以引用的方法返回函式值。
#include
float temp; //定義全域性變數temp
float fn1(float r); //宣告函式fn1
float &fn2(float r); //宣告函式fn2
float fn1(float r) //定義函式fn1,它以返回值的方法返回函式值
float &fn2(float r) //定義函式fn2,它以引用方式返回函式值
void main() //主函式
}(5)在另外的一些操作符中,卻千萬不能返回引用:+-*/ 四則運算符。它們不能返回引用,effective c++[1]的item23詳細的討論了這個問題。主要原因是這四個操作符沒有side effect,因此,它們必須構造乙個物件作為返回值,可選的方案包括:返回乙個物件、返回乙個區域性變數的引用,返回乙個new分配的物件的引用、返回一 個靜態物件引用。根據前面提到的引用作為返回值的三個規則,第2、3兩個方案都被否決了。靜態物件的引用又因為((a+b) == (c+d))會永遠為true而導致錯誤。所以可選的只剩下返回乙個物件了。
4、引用和多型
引用是除指標外另乙個可以產生多型效果的手段。這意味著,乙個基類的引用可以指向它的派生類例項。
【例7】:
class a;
class b:public a;
b b;
a &ref = b; // 用派生類物件初始化基類物件的引用
ref 只能用來訪問派生類物件中從基類繼承下來的成員,是基類引用指向派生類。如果a類中定義有虛函式,並且在b類中重寫了這個虛函式,就可以通過ref產生多型效果。
三、引用總結
(1)在引用的使用中,單純給某個變數取個別名是毫無意義的,引用的目的主要用於在函式引數傳遞中,解決大塊資料或物件的傳遞效率和空間不如意的問題。
(2)用引用傳遞函式的引數,能保證引數傳遞中不產生副本,提高傳遞的效率,且通過const的使用,保證了引用傳遞的安全性。
(3)引用與指標的區別是,指標通過某個指標變數指向乙個物件後,對它所指向的變數間接操作,可以指向多個變數。程式中使用指標,程式的可讀性差;而引用本身就是目標變數的別名,對引用的操作就是對目標變數的操作,乙個名稱只能引用乙個變數。
(4)使用引用的時機。流操作符《和》、賦值操作符=的返回值、拷貝建構函式的引數、賦值操作符=的引數、其它情況都推薦使用引用。
C 引用總結
乙個變數的乙個別名,乙個引用只屬於乙個變數。引用與其代表的變數共享同乙個儲存單元,與變數有著相同的位址 型別 引用名 變數名 在此起標識作用,並不代表取位址符 引用必須初始化。由於沒有單獨的儲存空間,引用只有宣告沒有定義。當 前為型別名時,必為引用宣告 int b a 當 單獨存在時 p a 為取位...
c 引用總結
引用做函式引數 struct teacher void printft teacher pt pt和t1的是兩個不同的變數 void printft3 teacher pt void main 引用的本質 struct teacer int main 1 引用在c 中的內部實現是乙個常指標type ...
C 引用總結
引用其實就是給乙個存在的變數取乙個別名,就像給人取外號一樣。編譯器不會給引用變數開闢記憶體空間,它和引用的變數公用一快記憶體空間。引用的規則是 型別 引用變數名 引用實體 如 test 輸出 0078f77c 0078f77c 引用也可以用來當作引數 void swap int left,int r...