2012-07-20 46 views
3

如果我想要一個指向另一個變量的指針,我通過給該變量的地址賦予&來做到這一點。在C++中初始化引用

int foo = 10; 
int *bar = &foo; 

現在,如果我遵循上述相同的邏輯,而是創建一個引用類型。

int foo = 10; 
int &bar = &foo; 

我認爲這應該工作,但事實並非如此。爲什麼?

+0

雖然我讚賞你對知識的追求,但我不禁想到以這種方式創建引用完全沒有意義 - 如果有這樣做的一些實用程序,請糾正我。 – 2012-07-20 22:52:43

+0

幾乎與該評論一樣毫無意義。我只是想了解這兩個例子之間的區別。 – Carlj901 2012-07-20 22:57:15

+0

請不要冒犯,因爲沒有人打算。我只是希望對這個我不知道的用例有所啓發。 – 2012-07-20 23:02:44

回答

3

因爲指針和引用不是一回事。 您可以將引用看作是「別名」或「別名」的意思。

換句話說,bar只是foo的另一個名字。 當您做int &bar = foo;時,您希望bar成爲foo的另一個名稱,您不希望將foo的地址分配給bar。但是,指針會存儲指向它的對象的地址,因此使用指針需要獲得foo的地址,並將其指定給bar指針。

+0

編譯器將如何解釋它?這些操作是否真的會在foo上完成,即bar會被foo取代,還是會作爲指向foo的指針? – Carlj901 2012-07-20 23:09:04

+1

@ user1047423:它是實現定義的。 C++標準規定,不指定引用是否具有存儲空間。換句話說,編譯器編寫者可以自由地做他們想做的事情。通常使用指針,但是一個實現可能會刪除所有的條,並且也可以使用foo。 – 2012-07-20 23:15:00

4

語法

int &bar = foo; 

wikipedia

+0

我想知道爲什麼它不起作用 – Carlj901 2012-07-20 22:48:20

+0

編譯器內部使'bar'指向'foo',這發生在幕後。這就是爲什麼它不起作用。 – badmaash 2012-07-20 22:50:52

+0

@badmaash:編譯器可能會採取每個說'bar'的地方,並用'foo'替代它,而不是使用指針。 – 2012-07-20 23:06:28

2

它不起作用,因爲引用需要使用與引用相同的類型進行初始化。在這種情況下:

int foo = 10; 
int &bar = foo; 

當您嘗試這種方法進行初始化:

int &bar = &foo; 

你試圖初始化一個指針到INT一個int參考。類型不匹配。

引用與指針不同,儘管編譯器可能會將其作爲指針下的指針來實現。一個參考基本上說「當我提到酒吧,我真的在談論foo」。