一種是按位與
1 & 2 = 0
一種是取位址
int* p = &a;
一種是宣告引用,相當於定義變數別名:
int a = 3;
int& b = a; // b是
a的引用,a,
b是同乙個變數
b = 4; // a也變化為
4int c = 2;
b = c; // 是賦值給b或
a,而不是把b作為
c的引用,引用一旦被宣告,引用物件不可更改
引用的實質是指標的簡化運用版,上面的**等價為:
int a = 3;
int* const b = &a; // 常指標,
b的位置不能更改,相當於引用不能更改自身的引用物件
*b = 4;
所以引用省去了宣告時的取位址操作和對變數記憶體位址引用時的解引用操作,而且引用不能隨意被更改,站在指標的角度上說,引用的意義等價於乙個常指標,也就是不能改變自己指向位置的指標。
引用在作為引數傳遞的時候,傳遞的是實參本身,c++
裡面類設計經常要傳遞整個類作為引數,但如果在不必要的時候使用傳統的按值傳遞,
效率損失可見一斑:
class foo
; void bar(foo f)
比如這個函式
bar,
傳參的時候是按值傳遞,也就是實參的所有資料被重新複製到引數f
裡,構造了乙個新物件
f,它只是輸出引數f的
abc成員,所以必要重新構造乙個臨時物件
f,這樣造成了效率的損失,解決方法有2種
:void bar1(foo* f)
var bar2(foo& f)
//建立乙個
test
的物件test ta;
&b = ta; //理解成
php的引用就可以了
...這相當於把
b的位址指向
ta,,
也就相當於b和
ta相等
,都指定同乙個記憶體位址
. 接下來是轉別人的例子:
引用是c++
引入的新語言特性,是
c++常用的乙個重要內容之一,正確、靈活地使用引用,可以使程式簡潔、高效。
首先我們來講一下指標
比如int a,b
int *pointer_1, *pointer_2
....
pointer_1 = &a; pointer_2 = &b
swap(pointer_1, pointer_2);
...........
在子函式中是
swap(int *p1, int *p2)
這裡實行交換操作
。。。。
解釋指標本質:
在主函式中
把指標變數pointer_1
和pointer_2
傳遞使p1和p2
也指向a,b
,先進行交換
,交換後,
pointer_1和p1
指向了b
但是pointer_2和p2
指向了a
,然後p1和p2
釋放了,但是交換卻成功了!
下面講引用轉()
引用就是某一變數(目標)的乙個別名,對引用的操作與對變數直接操作完全一樣。
引用的宣告方法:型別識別符號&
引用名=
目標變數名
;【例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( )
上述程式執行時,如果輸入資料10 20
並回車後,則輸出結果為
20 10
。 由【例2
】可看出: (1)
傳遞引用給函式與傳遞指標的效果是一樣的。這時,被調函式的形參就成為原來主調函式中的實參變數或物件的乙個別名來使用,所以在被調函式中對形參變數的操作就是對其相應的目標物件(在主調函式中)的操作。 (2)
使用引用傳遞函式的引數,在記憶體中並沒有產生實參的副本,它是直接對實參操作;而使用一般變數傳遞函式的引數,當發生函式呼叫時,需要給形參分配儲存單元,形參變數是實參變數的副本;如果傳遞的是物件,還將呼叫拷貝建構函式。因此,當引數傳遞的資料較大時,用引用比用一般變數傳遞引數的效率和所佔空間都好。
(3)使用指標作為函式的引數雖然也能達到與使用引用的效果,但是,在被調函式中同樣要給形參分配儲存單元,且需要重複使用
"*指標變數名
"的形式進行運算,這很容易產生錯誤且程式的閱讀性較差;另一方面,在主調函式的呼叫點處,必須用變數的位址作為實參。而引用更容易使用,更清晰。
如果既要利用引用提高程式的效率,又要保護傳遞給函式的資料不在函式中被改變,就應使用常引用。
自己理解的:::
引用就好象取了另乙個名字,比如我現在叫小明,取個外號叫豬頭,但是所指的是同乙個人而已
我是如此理解的,我們應該知道皮影戲,人用線操做木偶,我們可以這個樣子想,比如我們可以用手操作木偶去辦事,木偶做的事不就是自己直接在做的啊,所以在子函式中操作就等於在主函式中操作一樣(我自己理解的可能有錯誤)
但是我們可能碰到例如
intstackempty(sqstack s)
int push(sqstack&s, selemtype e)
*s.top++ = e;
return true;
}
int pop(sqstack&s, selemtype&e)
在堆疊操作中,有的不用&
,有的要用
&,為什麼呢
? 什麼時候使用引用
1、現在可以總結一下什麼時候使用引用這個問題了。
首先我們要看看什麼時候必須使用引用:
流操作符<<
和》、賦值操作符
=的返回值
拷貝建構函式的引數、賦值操作符=
的引數2、其它下面的情況都是推薦使用引用,但是也可以不使用引用。如果不想使用引用,完全可以使用指標或者其它類似的東西替代:
異常catch
的參數列
大物件作為引數傳遞
返回容器類中的單個元素
返回類資料成員(非內建資料型別成員)
返回其它持久存在的,且獲得者不負責銷毀的物件
另外一些情況下,不能返回引用:
+-*/四則運算符
關於引用及取位址 運算子的用法
在習慣了c語言的程式設計師眼裡 這個符號的意思就是取位址和對位進行與運算 但在c 中 被過載多了一種意思 就是引用。在這裡我就不介紹位與運算了 我先介紹一下取位址運算 在學習指標的時候我們就已經用過了取位址符了 使用方法為在變數前面加上 即可。int i 0 pi i 指標pi獲得了i的位址 int...
C 中的取位址符
這個符號特別容易混淆,因為在c 中,有兩種不同用法 獲得變數位址 引用傳遞 第乙個例子,int main 0x7ffd05129510 hello finished in 0.2s 例子中,變數p使用 宣告為指標,將變數s的位址通過 符號賦值給p.int main hello hello new h...
C C 中取位址符 的語義
在c語言中,符號大家一定很熟悉吧。它除了可以作為按位運算 與 之外還有更常用的功能 取變數位址。我們首先看下面乙個簡單的例子 include int main void 上面 中,指標p指向變數a的位址。在c c 中,每個變數都有其相應的位址,通過在變數識別符號前加 符號即可獲得變數的位址。那麼我們...