C++中引用的本质
一般的教材上講到引用時(shí),都是說(shuō)“引用是對(duì)象的一個(gè)別名”。我認(rèn)為這種定義是不清晰的,不利于初學(xué)者理解引用。至少我自己曾經(jīng)被這個(gè)定義困擾了一段時(shí)間。到底什么是“別名”?
??? 實(shí)際上,引用的實(shí)質(zhì)是位于xxxxxx地址上的一個(gè)xxxx類(lèi)型的對(duì)象。比如教科書(shū)上常用的例子:
??? int a = 5;?????????? //不妨假設(shè)編譯器將a分配到0x400000
??? int &b = a;
??? 這里面b的準(zhǔn)確意義就是,放在0x400000地址上的一個(gè)int類(lèi)型對(duì)象。這里面包括了兩重含義,首先b是一個(gè)int類(lèi)型對(duì)象,因此他的使用完全與 int類(lèi)型對(duì)象一樣。另外這個(gè)int類(lèi)型對(duì)象的地址是0x400000,因此從底層來(lái)看,它具有指針的一些特性,無(wú)論你怎樣傳遞,他都代表放在 0x400000的那個(gè)int.
??? 在c++中,引用全部是const類(lèi)型,定義之后不可更改。實(shí)際上“引用”對(duì)目標(biāo)代碼來(lái)說(shuō)是不存在的,因?yàn)閷?duì)于編譯器來(lái)說(shuō),使用上例中的b就是使用 0x400000地址的那個(gè)int.引用一經(jīng)定義,就不會(huì)指向別的地址,也不會(huì)指向別的類(lèi)型,因此編譯器不會(huì)專(zhuān)門(mén)開(kāi)辟空間存儲(chǔ)這個(gè)引用,而是將發(fā)送引用的地方替換為真正的地址,接收引用的地方則替換為接受指針。
??? 在java中,數(shù)據(jù)對(duì)象也都是引用類(lèi)型,但是這里的引用與C++有很大不同,他們不是const類(lèi)型,可以指向一個(gè)空值,也可以隨時(shí)更改其指向的內(nèi)存地址。這實(shí)際上與C++中的指針概念完全對(duì)應(yīng)。java中的引用實(shí)際上對(duì)應(yīng)C++中的指針而非引用,只不過(guò)是省去了C++中指針的取地址(&)與取值(*)操作。
?
指針和引用的區(qū)別?
?
(1)引用在創(chuàng)建時(shí)必須初始化,指針可以不初始化,引用不可以為NULL指針可以。 (2)不存在指向空值的引用,但是存在指向空值的指針。 (3)引用初始化后不能被改變,指針可以改變所指的對(duì)象.轉(zhuǎn)載于:https://www.cnblogs.com/abelian/p/6023602.html
總結(jié)
- 上一篇: POJ 3348 Cows 凸包面积
- 下一篇: shell-sed命令详解(转)