引用
起來(lái)晚了,不過(guò)還是要寫(xiě)點(diǎn)給大家啊,今天告訴大家一個(gè)C++獨(dú)有的功能——引用。
為什么要叫這么怪的名字呢?來(lái)我們先看個(gè)列子:

void swap(int& i, int& j)
{
int tmp = i;
i = j;
j = tmp;
}

int main()
{
int x, y;
// ...
swap(x,y);
}
此處的 i 和 j 分別是main中的 x 和 y。換句話說(shuō),i 就是 x —— 并非指向 x 的指針,也不是 x 的拷貝,而是 x 本身。對(duì) i 的任何改變同樣會(huì)影響 x,反之亦然。

OK,這就是作為一個(gè)程序員所認(rèn)知的引用。現(xiàn)在,給你一個(gè)不同的角度,這可能會(huì)讓你更糊涂,那就是引用是如何實(shí)現(xiàn)的。典型的情況下,對(duì)象 x 的引用 i 是 x 的機(jī)器地址。但是,當(dāng)程序員寫(xiě) i++ 時(shí),編譯器產(chǎn)生增加 x 的代碼。更詳細(xì)的來(lái)說(shuō),編譯器用來(lái)尋找 x 的地址位并沒(méi)有被改變。C 程序員將此認(rèn)為好像是 C 風(fēng)格的按指針傳遞,只是句法不同 (1) 將 & 從調(diào)用者移到了被調(diào)用者處,(2)消除了*s。換句話說(shuō),C 程序員會(huì)將 i 看作為宏 (*p),而 p 就是指向 x 的指針(例如,編譯器自動(dòng)地將潛在的指針解除引用;i++被改變?yōu)?(*p)++;i = 7 被自動(dòng)地轉(zhuǎn)變成 *p = 7)。

很重要:請(qǐng)不要將引用看作為指向一個(gè)對(duì)象的奇異指針,即使引用經(jīng)常是用匯編語(yǔ)言下的地址來(lái)實(shí)現(xiàn)的。引用就是對(duì)象。不是指向?qū)ο蟮闹羔槪膊皇菍?duì)象的拷貝,就是對(duì)象。

另外一個(gè)注意的地方:引用和指針不同,一旦引用和對(duì)象綁定,它無(wú)法再被重新指向其他對(duì)象。引用本身不是一個(gè)對(duì)象(它沒(méi)有標(biāo)識(shí); 當(dāng)試圖獲得引用的地址時(shí),你將的到它的指示物的地址;記住:引用就是它的指示物)。

從某種意義上來(lái)說(shuō),引用類似 int* const p 這樣的const指針(并非如 const int* p 這樣的指向常量的指針)。不管有多么類似,請(qǐng)不要混淆引用和指針;它們完全不同。