2010-06-09 27 views
3

我有一個方法:C++:無法從富轉換及爲foo *

odp(foo& bar); 

我試圖把它叫做:

foo baz; 
odp(&baz); 

我得到一個編譯錯誤:

error C2664: "odp" cannot convert parameter 1 from 'foo *' to 'foo &' 

我做錯了什麼?我不是在傳遞baz的參考嗎?

UPDATE:也許我對指針和引用之間的關係有誤解。我認爲它們是一樣的,除非引用不能爲空。那是不正確的?

+1

不,你正在傳遞一個指向'baz'的指針。 '&'運算符取對象的地址(給你一個指針)。 – dreamlax 2010-06-09 22:07:15

+0

指針和引用不完全相同。它們都是間接執行的手段,但相似之處結束了。它們不能以任何方式互換。 – 2010-06-09 22:11:31

+1

聽起來像你可能需要一本好書來教你什麼意思。 http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – GManNickG 2010-06-09 22:27:43

回答

7

當您將一元&運營商的一個對象,你會得到一個指針到該對象,而不是一個參考。在這種情況下你需要一個參考。爲了初始化引用參數,您根本不需要應用任何運算符:左值對象可以立即用於初始化相應類型的引用。

「指針」和「引用」的概念(如「通過指針傳遞」和「通過引用傳遞」)之間的非正式同義詞是C語言特有的。但在C++中,它們意味着兩件完全不同的事情。

+0

你能否詳細說明指針和引用之間的區別? – 2010-06-09 22:15:23

+0

@Rosarch:他們是兩回事。放棄你認爲你對他們瞭解的東西,這是你的區別。引用是變量的別名,指針是變量的地址,它們是不同的。一個引用不能爲「空」,因爲你不能別名一個不存在的變量。 – GManNickG 2010-06-09 22:26:05

+0

這裏的關鍵點是,「引用對變量是_aliases_」。它們不是變量的指針。 – 2010-06-10 05:40:14

4

odp函數需要對foo var的引用,而您正在傳遞foo var(pointer)的地址。

只是通過baz像:

foo baz; 
opd(baz); 

它將編譯。

+0

mm ...我以爲做了什麼會將'baz'複製到堆棧上,所以如果我對'baz'進行了更改,它們將不會被調用者看到? – 2010-06-09 22:07:37

+0

這樣,來電者可以看到對baz的任何更改。 – PeterK 2010-06-09 22:09:55

+0

不,您將引用傳遞給var,以便它可以按照您的要求工作。從odp()返回後,將baz修改爲odp()會被發現。 – 2010-06-09 22:11:08

2

不,你正在通過指針baz。丟掉&

2

當你使用& baz時,你實際上在說baz的地址,所以你傳遞了一個指針。

0

也許你被舊C公約誤導了?在C中,你通過創建一個指針「通過引用傳遞」,因爲語言沒有引用 - 你使用指向「引用」原始變量的指針。在C++中,引用是由語言支持的,並且在調用該函數時不需要創建指向該變量的指針。

foo baz; 
odp(baz); 
1

引用和指針是不是在C++一樣的 - 儘管你可能已經閱讀大多數編譯器實現了使用指針在機器代碼級的引用。你不需要關心它們是如何被編譯器實現的 - 但是在C++中「參考」和「指針」的語義是什麼。

int i = 5; 
int &j = i; // j refers to the variable i 
// wherever the code uses j, it actually uses i 
j++; // I just changed i from 5 to 6 
int *pj = &i; // pj is a pointer to i 
(*pj)--; // I just changed i back to 5 

請注意,我可以將pj更改爲指向另一個整數,但我無法更改引用j來引用另一個整數。

int k = 10; 
pj = &k; // pj now actually points to k 
(*pj)++; // I just changed k to 11 
j = k; // no, this doesn't change the reference j to refer to k instead of i, 
// but this statement just assigned k to i, that is, i now equals 11! 
1

在C++中,參考文獻是別名,不地址。例如,您可以爲單個指針指定多個名稱,就像您可能爲單個實際對象指定多個名稱一樣。

當您聲明一個採用引用參數的函數時,該函數將自動別名傳遞給它的任何變量。不管它的別名如何,必須與參考文獻的類型相同。在你的情況下,你用int引用別名int*,這是沒有意義的。

相關問題