(搬家文) c++引用深入探讨
(偶然翻起自己的舊博,忽然發(fā)現(xiàn)大三的時(shí)候?qū)懙倪@篇文章,仔細(xì)看看覺(jué)得寫(xiě)的還是那么回事,所以趕緊搭救出來(lái))
引用的聲明:?? 基本格式:引用類(lèi)型 &引用名=被引用對(duì)象?
引用的使用:引用可以被當(dāng)作被引用對(duì)象的別名使用,單純的引用是無(wú)意義的,引用主要應(yīng)用于四個(gè)方面:
?引用的深入探討:現(xiàn)在開(kāi)始進(jìn)入正題
??? 1.引用占內(nèi)存空間嗎?
??????? 如果引用只是一個(gè)別名的話 他不應(yīng)該占有內(nèi)存空間 我用下面這段代碼來(lái)查看
?
代碼 #include?<iostream>using?namespace?std;
void?fa(){
????int?a[4];????
????cout<<a<<endl;
}
void?fb(){
????int?a[4];
????int?&b=a[0];
????cout<<a<<endl;
????fa();
}
void?fc(){
????int?a[4];
????cout<<a<<endl;
????fb();
}
int?main()
{
????fc();
????getchar();
????return?0;
}
?
?
這段代碼里 我用了三個(gè)嵌套的函數(shù)調(diào)用 這樣 fa 和fc的棧段就把fb夾在了中間 fb的棧段大小變化的話 會(huì)導(dǎo)致fc中a的地址偏移 但是并不是每個(gè)分配都會(huì)導(dǎo)致棧段增大的 所以應(yīng)該先測(cè)試一下 確定a的合適大小 使得一旦聲明變量 b的棧段就增大。
把int?&b=a[0];注釋掉的話 可以看到fc中輸出的地址變了 fb沒(méi)有變 那么 引用b顯然占據(jù)了內(nèi)存空間 我的代碼在g++中編譯,結(jié)果也是g++的結(jié)果。
2.引用的值不可改變嗎?
一個(gè)已經(jīng)初始化的引用類(lèi)型對(duì)象 其引用的對(duì)象不可能被合法的改變。
前面一段代碼展示給我們 引用確實(shí)占據(jù)了內(nèi)存空間 ,了進(jìn)一步了解其本質(zhì),我們必須獲得它的地址。&取地址操作符顯然是無(wú)法做到的 幾乎每個(gè)學(xué)c++的人都會(huì)嘗試用這種辦法去取引用類(lèi)型的地址,但得到的都是被引用對(duì)象的地址。
還從前面的例子入手 fb中 a的地址沒(méi)有改變? fa中a的地址改變 那么 int &b的分配應(yīng)該在 二者之間 于是 最可能的位置就是a中的a[4]?? 但輸出之后我發(fā)現(xiàn)a[4]不是,因?yàn)閿?shù)組a是跟棧逆向分配的 之后我試了這樣的代碼
void fb(){
??? int a[4];
??? int b=20;
??? cout<<a[-1]<<endl;
??? fa();
}
?在我的編譯器中 b跟a[-1]總是相等 于是 我把int b 替換成int &b=a[0]; ok 我發(fā)現(xiàn)它指向了一個(gè)貌似地址的東西。改變b的指向 發(fā)現(xiàn)a[-1]是隨之變化的 現(xiàn)在 我?guī)缀蹩梢源_定 a[-1]就是b了 再用一段這樣的代碼來(lái)檢驗(yàn)
void fb(){
??? int a[4]={1,2,3,4};
??? int &b=a[0];
??? a[-1]+=4;
??? cout<<b<<","<<a[0]<<endl;
??? fa();
}
引用真的是不可改變的嗎? 在這個(gè)例子中 我使b指向了a[1] 而不再是a[0]
3.引用和指針
從上面的例子看出 引用的內(nèi)部實(shí)現(xiàn)和指針并無(wú)兩樣。如果參考其他語(yǔ)言的思想的話 可以得到結(jié)論:引用就是指針常量。 在c++中 引用在語(yǔ)法上與指針有著明顯的差異 但是 他們并沒(méi)有本質(zhì)不同 引用是c++中實(shí)現(xiàn)的一種限制比較嚴(yán)格的常量指針 它在參與任何運(yùn)算之前自動(dòng)解引用。
在使用中 推薦盡量用引用代替指針,因?yàn)橐檬且环N比指針更安全的類(lèi)型 并且有更清晰的語(yǔ)義(當(dāng)然指針也有適合的語(yǔ)義)
4.其他語(yǔ)言
順便一提,在C家的其他語(yǔ)言中 引用幾乎被作為訪問(wèn)對(duì)象的唯一手段
C++:有指針 所有運(yùn)算符會(huì)解引用 所有對(duì)象不作為引用 傳遞參數(shù)和返回值時(shí)如果不希望復(fù)制 則必須將形參指定為引用類(lèi)型
C#:?unsafe模式有指針 除了=之外的操作符會(huì)解引用 所有對(duì)象作為引用 傳遞參數(shù)和返回值時(shí)如果希望復(fù)制 則必須顯式clone
Java:無(wú)指針 除了=之外的操作符會(huì)解引用 類(lèi)似c#
javascript:無(wú)指針但是可以變通 除了=之外的操作符會(huì)解引用?沒(méi)有提供復(fù)制傳遞的方法(郁悶)
轉(zhuǎn)載于:https://www.cnblogs.com/winter-cn/archive/2010/07/15/1777668.html
總結(jié)
以上是生活随笔為你收集整理的(搬家文) c++引用深入探讨的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .NET平台依赖注入机制及IoC的设计与
- 下一篇: ABC类网络个数的算法