2011-10-06 75 views
3

在 「C++程序設計語言」,還有一個例子參考相關的問題在C++

void g() 
{ 
    int ii = 0; 
    int& rr = ii; 
    rr++; 
    int* pp = &rr; 
} 

筆者指出:

這是合法的,但RR ++不增加引用RR ,而是,++應用於碰巧是ii的int。

我對這句話很混淆,爲什麼「rr ++不增加引用rr」?所以rr只是作爲「橋樑」來增加ii?

+0

的引用不是指針。您無法修改參考,您可以修改存儲在參考內存中的值。 –

+1

我覺得作者的評論非常混亂。只要認識到'rr'本身不是一個對象,而只是另一個預先存在的對象的替代名稱。所以操作**不能在'rr'本身執行,而是在它所指向的* other *對象上執行。在這種情況下,'rr ++;'和'ii ++;'的效果是一樣的。 –

+2

說'rr'是另一個預先存在對象的替代名稱,因爲它不適合工作方式,所以IMO更令人困惑。引用不是別名,但它是它自己的實體。例如'int&r = * new int;刪除&r;'在這之後,'r'仍然存在,它引用的對象不再存在。參考*具有*名稱,它本身不是名稱。 –

回答

1

引用類似於取消引用的變量指針。例如:

int v = 3; 
int* pv = &v; 
int& rv = v; 

// Access v through a pointer: 
*pv = 4; 

// Access v through a reference: 
rv = 4; 

在這個例子中,這兩個語句將設置v至4

0

所以rr只是作爲「橋」來增加ii?

沒錯。在內部,它將存儲地址ii,編譯器將在此地址處增加int。可用於例如:

int left, right; 
... 
int &direction = random_bool() ? left : right; 
++direction; // would change left or right, depending on random_bool() 

但主要用於函數參數和返回類型。

+2

我很懷疑內部會有地址。相反,編譯器會發出會直接增加'ii'值的代碼。 –

+1

@KonradRudolph:沒有優化的gcc肯定會將地址存儲在堆棧中並使用它。說編譯器可能會優化它是毫無意義的 - 它可以,但它可能會平等地對待指針,它可以優化增量(將'ii'初始分配爲1而不是0),它甚至可以完全消除「ii」變量。一個好的優化編譯器肯定會做所有這些,把'g()'變成一個無操作。但是,這並沒有提到引用的行爲。 – jpalecek

0

它遞增ii,它不增加rr中包含的地址。

3

是的,在C++中,引用不過是一個別名,或者像你所說的「橋樑」。任何時候你說rr,它是就好像你說的iirr引用的變量的「原始」名稱。

這與許多其他語言中的引用不同(其行爲更像C++的指針)。在C++中,引用不是對象,它們沒有單獨的標識。你不能說「請增加」,或者「請指向空」或其他任何內容。它只是成爲參考指向的變量的另一個名稱。