2011-05-30 52 views
1

下面的代碼編譯並運行,但我不確定下一層究竟發生了什麼。沒有引用只是存儲被引用對象的地址?如果是這樣,兩個測試功能都將接收地址作爲參數?還是C++實現能夠以其他方式區分這些類型?函數重載在以下情況下如何工作?

int main() { 
    int i = 1; 
    cout << test(i) << endl; 
} 

char test(int &i) { 
    return 'a'; 
} 

char test(int *i) { 
    return 'b'; 
} 

回答

7

作爲int&int*是不同的類型和i可以被視爲一個int&但不是作爲int*,重載分辨率在這裏絕對是毫不含糊的。

在這一點上,引用僅僅是一種有點隱形的指針並不重要。從語言的角度來看,它們是不同的類型。

+0

好吧,這讓事情變得清晰 – 2011-05-30 19:49:58

1

因爲要傳遞一個int&給函數你代碼只與char test(int&i)匹配,並且不能被轉換到int*

2

C++中的引用更類似於指針的別名。引用本身並不是一個單獨的變量,但它是現有變量的新「名稱」。在你的例子中,第一個測試會被調用,因爲你正在向函數傳遞一個整數。指針是一個單獨的變量,它保存着另一個變量的地址,因此第二個被調用的函數必須用指針調用測試。像這樣.. test(&i);雖然有點混淆運營商&獲取變量的地址,而用&如int &i聲明的變量聲明參考。

相關問題