C++中的引用(reference) |
1.簡介 引用是C++引入的新語言特性。從語意上來說,引用就是一個變量的別名,就好象古代人的“字”和“號”,東坡居士和蘇軾只是一個人的不同稱呼。對引用的操作對變量產生的影響與對變量直接操作完全一樣。例如:int i = 0; int & iRef = i; iRef++; // i = iRef = 1 盡管引用不使用指針的操作符(*, ->)但是,它看上去跟指針好象并沒有區別,而且就上面的例子而言,這個引用所產生的作用完全可以由指針完成。那么為什么C++中還要增加這樣一個特性呢?引用顯然應該具備指針不能完成的功能,否則它就失去了價值。這方面的探討我們留到第3節。2.引用的語法 在這里我們只討論一些語法相關的問題。·引用必須在定義的同時初始化int i; int & j; // 錯誤,沒有初始化。 int & k=i; // 正確 這個例子有個很好的比喻,小時候小朋友間會互相起“外號”,這些外號在產生的時候總是有所指的,即針對一個具體的小朋友的。引用也一樣,定義的時候,必須指明它是誰的別名。·外部(extern)引用定義不必給出初值extern int & i; // 正確,不必給出初值·引用初始化后不能再使其成為其它變量的引用int j, k; int & i = j; i = k; // 錯誤,不能更改! 引用類似一個常量指針(int * const p),不能修改引用的指向。·引用的地址 假設有如下定義:int j; int & i = j; 那么,&i應該是什么呢?是一個“引用的地址”么?答案是:no。&i = &j,就是j這個變量的地址。3.引用使用技巧 3.1 引用和多態引用是除指針外另一個可以產生多態效果的手段。這意味著,一個基類的引用可以指向它的派生類實例。例如:class A;class B: public A { ... }; B b; A & aRef = b; // 基類引用指向派生類 假如A類中定義有虛函數,并且在B類中重寫了這個虛函數,就可以通過aRef產生多態效果。 3.2 作為參數引用的一個重要作用就是作為函數的參數類型。C/C++的函數參數是傳值的,假如有大對象(例如一個大的結構)需要作為參數傳遞的時候,以前的(C語言中)方案往往是指針,因為這樣可以避免將整個對象全部壓棧,可以提高程序的效率。但是現在(C++中)又增加了一種同樣有效率的選擇,就是引用。 與指針類型的參數一樣,引用不論指向什么類型的對象,作為參數傳遞的時候都是只壓棧4個字節(在32位機上)。引用所占用的4字節大小是根據編譯器產生的代碼判定的,因為sizeof(a_reference)只能得到它所指向對象的大小。 引用型參數應該在能被定義為const的情況下,盡量定義為const,這不光是讓代碼更健壯,也有些其它方面的需要,例如,假設有如下函數聲明:string foo();void bar(string & s); 那么下面的表達式將是非法的:bar(foo()); bar("hello world"); 原因在于foo()和"hello world"串都會產生一個臨時對象,而在C++中,這些臨時對象都是const類型的。因此上面的表達式就是試圖將一個const類型的對象轉換為非const類型,這是非法的。 3.3 作為返回值引用作為返回值的時候,有一些規則必須遵守。這些規則包括:
3.4 什么時候使用引用現在可以總結一下什么時候使用引用這個問題了。首先我們要看看什么時候必須使用引用:
|
新聞熱點
疑難解答