在 「C++程序設計語言」,還有一個例子參考相關的問題在C++
void g()
{
int ii = 0;
int& rr = ii;
rr++;
int* pp = &rr;
}
筆者指出:
這是合法的,但RR ++不增加引用RR ,而是,++應用於碰巧是ii的int。
我對這句話很混淆,爲什麼「rr ++不增加引用rr」?所以rr只是作爲「橋樑」來增加ii?
在 「C++程序設計語言」,還有一個例子參考相關的問題在C++
void g()
{
int ii = 0;
int& rr = ii;
rr++;
int* pp = &rr;
}
筆者指出:
這是合法的,但RR ++不增加引用RR ,而是,++應用於碰巧是ii的int。
我對這句話很混淆,爲什麼「rr ++不增加引用rr」?所以rr只是作爲「橋樑」來增加ii?
引用類似於取消引用的變量指針。例如:
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
所以rr只是作爲「橋」來增加ii?
沒錯。在內部,它將存儲地址ii
,編譯器將在此地址處增加int
。可用於例如:
int left, right;
...
int &direction = random_bool() ? left : right;
++direction; // would change left or right, depending on random_bool()
但主要用於函數參數和返回類型。
我很懷疑內部會有地址。相反,編譯器會發出會直接增加'ii'值的代碼。 –
@KonradRudolph:沒有優化的gcc肯定會將地址存儲在堆棧中並使用它。說編譯器可能會優化它是毫無意義的 - 它可以,但它可能會平等地對待指針,它可以優化增量(將'ii'初始分配爲1而不是0),它甚至可以完全消除「ii」變量。一個好的優化編譯器肯定會做所有這些,把'g()'變成一個無操作。但是,這並沒有提到引用的行爲。 – jpalecek
它遞增ii
,它不增加rr
中包含的地址。
是的,在C++中,引用不過是一個別名,或者像你所說的「橋樑」。任何時候你說rr
,它是就好像你說的ii
,rr
引用的變量的「原始」名稱。
這與許多其他語言中的引用不同(其行爲更像C++的指針)。在C++中,引用不是對象,它們沒有單獨的標識。你不能說「請增加」,或者「請指向空」或其他任何內容。它只是成爲參考指向的變量的另一個名稱。
的引用不是指針。您無法修改參考,您可以修改存儲在參考內存中的值。 –
我覺得作者的評論非常混亂。只要認識到'rr'本身不是一個對象,而只是另一個預先存在的對象的替代名稱。所以操作**不能在'rr'本身執行,而是在它所指向的* other *對象上執行。在這種情況下,'rr ++;'和'ii ++;'的效果是一樣的。 –
說'rr'是另一個預先存在對象的替代名稱,因爲它不適合工作方式,所以IMO更令人困惑。引用不是別名,但它是它自己的實體。例如'int&r = * new int;刪除&r;'在這之後,'r'仍然存在,它引用的對象不再存在。參考*具有*名稱,它本身不是名稱。 –