深入分析C 引用 指標常量

2021-09-24 09:45:55 字數 1815 閱讀 9799

引言

我選擇寫 c++ 中的引用是因為我感覺大多數人誤解了引用。而我之所以有這個感受是因為我主持過很多 c++ 的面試,並且我很少從面試者中得到關於 c++ 引用的正確答案。

那麼 c++ 中引用到底意味這什麼呢?通常乙個引用讓人想到是變數的別名,而我討厭將 c++ 中引用定義為變數的別名。這篇文章中,我將盡量解釋清楚, c++ 中根本就沒有什麼叫做別名的東東,而是乙個指標常量

背景 在 c/c++ 中,訪問乙個變數只能通過兩種方式被訪問,傳遞,或者查詢。這兩種方式是:

1. 通過值 訪問 / 傳遞變數

2. 通過位址 訪問 / 傳遞變數 – 這種方法就是指標

除此之外沒有第三種訪問和傳遞變數值的方法。引用變數也就是個指標變數,它也擁有記憶體空間。最關鍵的是引用是一種會被編譯器自動解引用的指標。很難相信麼?讓我們來看看吧。。。

下面是一段使用引用的簡單 c++ **

#include int main()

;int main()

{

// this will print 12 i.e. size of 3 pointers

cout<< "size of class test = " << sizeof(class test) < 結論

我希望這篇文章能把 c++ 引用的所有東東都解釋清楚,然而我要指出的是 c++ 標準並沒有解釋編譯器如何實現引用的行為。所以實現取決於編譯器,而大多數情況下就是將其實現為乙個 const 指標。

引用支援 c++ 虛函式機制的**

#include class a

{public:

virtual void print() { cout<<"a.."<

上述**使用引用支援虛函式機制。

如果引用僅僅是乙個別名,那如何實現虛函式機制,而虛函式機制所需要的動態資訊只能通過指標才能實現,所以更加說明引用其實就是乙個 const 指標。

引用的使用規則:

a:引用在建立的時候必須被初始化;指標可以不初始化(指標使用時必須先判斷是否為空值

b:不存在指向空值的引用這個事實,意味著使用引用的**效率比使用指標的要高。因為在使用引用之前不需要測試它的合法性。相反,指標則應該總是被測試,防止其為空。

c:一旦引用初始化後,就不能改變引用所指向的變數; 指標可以改變指向別的物件

d: 引用是乙個常量,佔記憶體,並和指標占用的記憶體大小一樣; 指標也佔記憶體,它是乙個變數

其實引用是否佔記憶體標準中並沒有規定,可以視它為指標常量,並且在編譯器優化後它不佔記憶體

e:理論上,對於指標的級數沒有限制,但是引用只能是一級。如下:

int** p1;         // 合法。指向指標的指標

int*& p2;         // 合法。指向指標的引用

int&* p3;         // 非法。指向引用的指標是非法的

int&& p4;         // 非法。指向引用的引用是非法的

注意上述讀法是從左到右。 

f:「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof 指標」得到的是指標本身的大小;

g:指標和引用的自增(++)運算意義不一樣;

h:引用是型別安全的,而指標不是 (引用比指標多了型別檢查

引用作函式的引數:

引用作引數時不產生引用指向的物件的副本,節省時間和空間,且能夠直接對指向的物件進行操作,可以達到指標同樣的效果,但是使用方法更簡潔,不易錯

引用作為函式的返回值:

不能返回函式內部臨時物件的引用

當需要返回的物件作為左值時需要返回引用 比如過載操作符 [ ] 時就必須使用引用 ,例 str[3] = 'a'; 

深入分析C 引用

關於引用和指標的區別的文章很多很多,但是總是找不到他們的根本區別,偶然在codeproject上看到這篇文章,覺得講的挺好的,所以翻譯了下,希望對大家有幫助。引言 我選擇寫 c 中的引用是因為我感覺大多數人誤解了引用。而我之所以有這個感受是因為我主持過很多 c 的面試,並且我很少從面試者中得到關於 ...

深入分析C 引用

摘自 關於引用和指標的區別的文章很多很多,但是總是找不到他們的根本區別,偶然在codeproject上看到這篇文章,覺得講的挺好的,所以翻譯了下,希望對大家有幫助。引言我選擇寫 c 中的引用是因為我感覺大多數人誤解了引用。而我之所以有這個感受是因為我主持過很多 c 的面試,並且我很少從面試者中得到關...

深入分析C 引用

關於引用和指標的區別的文章很多很多,但是總是找不到他們的根本區別,偶然在codeproject上看到這篇文章,覺得講的挺好的,所以翻譯了下,希望對大家有幫助。引言我選擇寫 c 中的引用是因為我感覺大多數人誤解了引用。而我之所以有這個感受是因為我主持過很多 c 的面試,並且我很少從面試者中得到關於 c...