天天看點

深入探讨C++引用

引用是C++引入的新語言特性,是C++常用的一個重要内容之一,正确,靈活地使用引用,可以使程式簡潔,高效.我在工作中發現,許多人使用它僅僅是想當然,在某些微妙的場合,很容易出錯,究其原由,大多因為沒有搞清本源.故在本篇中我将對引用進行詳細讨論,希望對大家更好地了解和使用引用起到抛磚引玉的作用.

引用簡介

引用就是某一變量(目标)的一個别名,對引用的操作與對變量直接操作完全一樣.

引用的聲明方法:類型辨別符 &引用名=目标變量名;

【例1】:int a; int &ra=a; //定義引用ra,它是變量a的引用,即别名

說明:(1)&在此不是求位址運算,而是起辨別作用.

(2)類型辨別符是指目标變量的類型.

(3)聲明引用時,必須同時對其進行初始化.

(4)引用聲明完畢後,相當于目标變量名有兩個名稱,即該目标原名稱和引用名,且不能再把該引用名作為其他變量名的别名.

ra=1; 等價于 a=1; 

(5)聲明一個引用,不是新定義了一個變量,它隻表示該引用名是目标變量名的一個别名,它本身不是一種資料類型,是以引用本身不占存儲單元,系統也不給引用配置設定存儲單元.故:對引用求位址,就是對目标變量求位址.&ra與&a相等.

(6)不能建立數組的引用.因為數組是一個由若幹個元素所組成的集合,是以無法建立一個數組的别名.

2 引用應用

2.1 引用作為參數 

引用的一個重要作用就是作為函數的參數.以前的C語言中函數參數傳遞是值傳遞,如果有大塊資料作為參數傳遞的時候,采用的方案往往是指針,因為這樣可以避免将整塊資料全部壓棧,可以提高程式的效率.但是現在(C++中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引用.

【例2】:

深入探讨C++引用

void swap(int &p1, int &p2) //此處函數的形參p1, p2都是引用

深入探讨C++引用
深入探讨C++引用

{ int p;

深入探讨C++引用

p=p1;

深入探讨C++引用

p1=p2;

深入探讨C++引用

p2=p;

深入探讨C++引用

}

為在程式中調用該函數,則相應的主調函數的調用點處,直接以變量作為實參進行調用即可,而不需要實參變量有任何的特殊要求.如:對應上面定義的swap函數,相應的主調函數可寫為:

深入探讨C++引用

main( )

深入探讨C++引用

{ int a,b;

深入探讨C++引用

cin>>a>>b; //輸入a,b兩變量的值

深入探讨C++引用

swap(a,b); //直接以變量a和b作為實參調用swap函數 

深入探讨C++引用

cout<<< ? <<b; 輸出結果 

深入探讨C++引用
深入探讨C++引用
深入探讨C++引用

<a>(5)在另外的一些操作符中,卻千萬不能傳回引用:+-*/ 四則運算符.它們不能傳回引用,Effective C++[1]的Item23詳細的讨論了這個問題.主要原因是這四個操作符沒有side effect,是以,它們必須構造一個對象作為傳回值,可選的方案包括:傳回一個對象,傳回一個局部變量的引用,傳回一個new配置設定的對象的引用,傳回一個靜态對象引用.根據前面提到的引用作為傳回值的三個規則,第2,3兩個方案都被否決了.靜态對象的引用又因為((a+b) == (c+d))會永遠為true而導緻錯誤.是以可選的隻剩下傳回一個對象了. 2.4 引用和多态  引用是除指針外另一個可以産生多态效果的手段.這意味着,一個基類的引用可以指向它的派生類執行個體. 【例7】:  class A; class B:public A{……}; B b; A &amp;Ref = b; // 用派生類對象初始化基類對象的引用 Ref 隻能用來通路派生類對象中從基類繼承下來的成員,是基類引用指向派生類.如果A類中定義有虛函數,并且在B類中重寫了這個虛函數,就可以通過Ref産生多态效果. 引用總結 (1)在引用的使用中,單純給某個變量取個别名是毫無意義的,引用的目的主要用于在函數參數傳遞中,解決大塊資料或對象的傳遞效率和空間不如意的問題. (2)用引用傳遞函數的參數,能保證參數傳遞中不産生副本,提高傳遞的效率,且通過const的使用,保證了引用傳遞的安全性. (3)引用與指針的差別是,指針通過某個指針變量指向一個對象後,對它所指向的變量間接操作.程式中使用指針,程式的可讀性差;而引用本身就是目标變量的别名,對引用的操作就是對目标變量的操作. (4)使用引用的時機.流操作符&lt;&gt;,指派操作符=的傳回值,拷貝構造函數的參數,指派操作符=的參數,其它情況都推薦使用引用.</a>

繼續閱讀