一般的教材上講到引用時,都是說“引用是對象的一個別名”。 我認為這種定義是不清晰的,不利於初學者理解引用。至少我自己曾經被這個定 義困擾了一段時間。到底什麼是“別名”?
實際上,引用的實質是位於xxxxxx地址上的一個xxxx類型的對象。比如教科 書上常用的例子:
int a = 5; //不妨假設編譯器將a分配到0x400000
int &b = a;
這裡面b的准確意義就是,放在0x400000地址上的一個int類型對象。這裡面 包括了兩重含義,首先b是一個int類型對象,因此他的使用完全與int類型對象 一樣。另外這個int類型對象的地址是0x400000,因此從底層來看,它具有指針 的一些特性,無論你怎樣傳遞,他都代表放在0x400000的那個int.
在c++中,引用全部是const類型,定義之後不可更改。實際上“引用 ”對目標代碼來說是不存在的,因為對於編譯器來說,使用上例中的b就是 使用0x400000地址的那個int.引用一經定義,就不會指向別的地址,也不會指向 別的類型,因此編譯器不會專門開辟空間存儲這個引用,而是將發送引用的地方 替換為真正的地址,接收引用的地方則替換為接受指針。
在java中,數據對象也都是引用類型,但是這裡的引用與C++有很大不同,他 們不是const類型,可以指向一個空值,也可以隨時更改其指向的內存地址。這 實際上與C++中的指針概念完全對應。java中的引用實際上對應C++中的指針而非 引用,只不過是省去了C++中指針的取地址(&)與取值(*)操作。