關於引用和指標的區別的文章很多很多,但是總是找不到他們的根本區別,偶然在codeproject上看到這篇文章,覺得講的挺好的,
所以翻譯了下,希望對大家有幫助。
引言 我選擇寫 c++ 中的引用是因為我感覺大多數人誤解了引用。而我之所以有這個感受是因為我主持過很多 c++ 的面試,並且我很少從面試者中得到關於 c++ 引用的正確答案。
那麼 c++ 中引用到底意味這什麼呢?通常乙個引用讓人想到是乙個引用的變數的別名,而我討厭將 c++ 中引用定義為變數的別名。這篇文章中,我將盡量解釋清楚, c++ 中根本就沒有什麼叫做別名的東東。
背景 在 c/c++ 中,訪問乙個變數只能通過兩種方式被訪問,傳遞,或者查詢。這兩種方式是:
1. 通過值 訪問 / 傳遞變數
2. 通過位址 訪問 / 傳遞變數 – 這種方法就是指標
除此之外沒有第三種訪問和傳遞變數值的方法。引用變數也就是個指標變數,它也擁有記憶體空間。最關鍵的是引用是一種會被編譯器自動解引用的指標。很難相信麼?讓我們來看看吧。。。
下面是一段使用引用的簡單 c++ **
[cpp]view plain
copy
print?
#include
int main()
引用其實就是 c++ 中的常量指標。表示式 int &i = j; 將會被編譯器轉化成 int *const i = &j; 而引用之所以要初始化是因為 const 型別變數必須初始化,這個指標也必須有所指。下面我們再次聚焦到上面這段**,並使用編譯器的那套語法將引用替換掉。
[cpp]view plain
copy
print?
#include
int main()
所以語句 cout << &i << &j << endl; 變成了 cout << &i << &*j << endl; 這兩種情況都是列印輸出 i 的位址。這就是當我們列印普通變數和引用變數的時候會輸出相同位址的原因。
下面給出一段複雜一些的**,來看看引用在級聯 (cascading) 中是如何運作的。
[cpp]view plain
copy
print?
#include
int main()
下面這段**是將上面**中的引用替換之後**,也就是說明我們不依賴編譯器的自動替換功能,手動進行替換也能達到相同的目標。
[cpp]view plain
copy
print?
#include
int main()
我們通過下面**可以證明 c++ 的引用不是神馬別名,它也會占用記憶體空間的。
[cpp]view plain
copy
print?
#include
class test
; int main()
結論 我希望這篇文章能把 c++ 引用的所有東東都解釋清楚,然而我要指出的是 c++ 標準並沒有解釋編譯器如何實現引用的行為。所以實現取決於編譯器,而大多數情況下就是將其實現為乙個 const 指標。
引用支援 c++ 虛函式機制的**
[cpp]view plain
copy
print?
#include
class a
; class b : public a
; class c : public b
; int main()
上述**使用引用支援虛函式機制。如果引用僅僅是乙個別名,那如何實現虛函式機制,而虛函式機制所需要的動態資訊只能通過指標才能實現,所以更加說明引用其實就是乙個 const 指標。
深入分析C 引用
摘自 關於引用和指標的區別的文章很多很多,但是總是找不到他們的根本區別,偶然在codeproject上看到這篇文章,覺得講的挺好的,所以翻譯了下,希望對大家有幫助。引言我選擇寫 c 中的引用是因為我感覺大多數人誤解了引用。而我之所以有這個感受是因為我主持過很多 c 的面試,並且我很少從面試者中得到關...
深入分析C 引用
關於引用和指標的區別的文章很多很多,但是總是找不到他們的根本區別,偶然在codeproject上看到這篇文章,覺得講的挺好的,所以翻譯了下,希望對大家有幫助。引言我選擇寫 c 中的引用是因為我感覺大多數人誤解了引用。而我之所以有這個感受是因為我主持過很多 c 的面試,並且我很少從面試者中得到關於 c...
深入分析C 引用
背景 在 c c 中,訪問乙個變數只能通過兩種方式被訪問,傳遞,或者查詢。這兩種方式是 1.通過值 訪問 傳遞變數 2.通過位址 訪問 傳遞變數 這種方法就是指標 除此之外沒有第三種訪問和傳遞變數值的方法。引用變數也就是個指標變數,它也擁有記憶體空間。最關鍵的是引用是一種會被編譯器自動解引用的指標。...