2011-05-30 2 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

ah ok, это делает для меня все ясно –

1

вы код совпадает только с char test(int&i), так как вы пропусканием int& к функции и которые не могут быть преобразованы в int*

2

Ссылки на C++ более похожи на псевдоним, чем указатель. Ссылка не является отдельной переменной сама по себе, но это новое «имя» для существующей переменной. В вашем примере первый вызов будет вызван, потому что вы передаете целое число функции. Указатель - это отдельная переменная, которая содержит адрес другой переменной, поэтому для вызова второй функции вам нужно будет вызвать тест с помощью указателя. Вроде так .. test(&i); Пока немного запутывает оператор & получает адрес переменной, а переменная, объявленная с &, как int &i, объявляет ссылку.

Смежные вопросы