c 引用極其底層實現

2021-07-11 04:16:56 字數 2136 閱讀 8869

一、c++中引用的語法是這樣的:

int x = 100;

int& _x = x;

它的意思就是是給變數x起了乙個別名,在以後的**中,_x其實就是x,這兩個是等價的。舉個例子,在《唐伯虎點秋香》中,唐伯虎叫做華安,又叫做9527,其實這三個名字都是同乙個人,引用就是這個意思。

注意事項:

引用初始化的時候一定要繫結乙個變數;

引用一旦初始化,則終身為這個變數服務;

不能返回區域性變數的引用,就像指標一樣,不能返回區域性變數的指標;

二、引用的幾處應用

1、普通的引用

int x = 100;

int& _x = x;

這裡還有乙個問題,就是int& x = 100;如果寫成這樣,編譯器會報錯,對常數的引用必須加const修飾,const int& x = 100;

2、作為函式的形參

int max(int& x,int& y),這樣做的好處是沒有對實參進行複製拷貝,提高了效率。

3、引用作為函式的返回值

對於這樣乙個函式int max(int& x,int& y),我們可以這樣用int z = max(1,2),這很正常,我們都這樣用,但是你絕對不能這樣用max(1,2) = 100;也就是說,函式的返回值不能作為左值。但是如果寫成這樣int& max(jint& x,int& y)之後,max(1,2) = 100這句話立馬就是合理的了。

#include using namespace std;

int& getmax(int& x1,int& y1)

void main(){

int x = 10;

int y = 123;

//int z = getmax(x,y);

int& z = getmax(x,y);//用引用來接,和不用引用來接

//int z = getmax(x, y);//對比一下,用引用來接返回值,和不用引用來接有什麼區別

getmax(x,y) = 1000;//把z和y全部綁到一起

cout << z << endl;

cout << y <

上面的**如果用引用來接,則輸出的z和y都是1000,如果注釋掉引用來接這一行,換成沒有用引用來接,則輸出的z和y是123,1000.

三、引用的實現

引用的特點就是:乙個引用一旦引用了乙個變數,就不能再去引用其他的變數了,但是引用的變數可以重新被賦值。基於上面的特點,我們來看兩個指標:

int x = 100;

1:int const * pi = &x;

2:int  * const pi = &x;

第乙個指標表示這個指標pi還可以解除當前繫結,然後繫結到其他指標上,但是所繫結物件的值不能被重新賦進去。就是說如果有int y = 100的話,pi = &y是合法的,但是*pi = 200就是不合法的。

第二個指標和第乙個相反,*pi = 200是合法的,但是pi = &y是不合法,根據這兩個指標的性質,第二個指標就是引用的實現。

理解C 中引用的底層實現

1 c primer提到 引用並非物件,相反的,它只是為乙個已經存在的物件所起的另外乙個名字。引用的定義必須伴隨初始化,而且一旦定義了引用,就無法令其再繫結到另外的物件,之後每次使用這個引用都是訪問它最初繫結的那個物件。2 何為物件?對於物件導向來說,物件就是類的例項,是抽象化的資料本身。更廣義的來...

c 中「引用」的底層實現原理詳解

c 中 引用 的底層實現原理詳解 c c lws123253的部落格 csdn部落格 目錄 初學c 中的 引用 這一概念的時候,很多人都是懵的,大家大概都會產生這樣的疑問?什麼是引用?引用占用記憶體嗎?於是,為了驗證你的猜想,你可能會寫出下面這樣的 來驗證 includeusing namespac...

迭代器底層實現 C

迭代器 iterator 是一種物件,用來遍歷容器中部分或全部的元素.拿foreach的內部實現來舉例。foreach可以用來遍歷可列舉型別集合的元素,比如 陣列,list,dictionary等 其實就是用while語句來獲取遍歷集合的 ienumerator介面 來不斷的movenext 後面會...