Страницы

Поиск по вопросам

понедельник, 4 февраля 2019 г.

Амперсанд в параметрах функции

Здравствуйте, подскажите пожалуйста, как это работает? Допустим, имеется такая функция:
void foo(int &one, int two){ one = two; }
int s1 = 1; int s2 = 2; foo(s1, s2);
Как работает амперсанд перед параметром функции one? Я понимаю, что функция работает с переменной, которая выделена в статической памяти. Выходит, что мы передаем в функцию значение типа int, затем берем его адрес. Но почему в теле функции можем работать с ним как с обычной переменной, а не как с указателем? По идее, нужно было бы разыменовывать.
Такая конструкция понятна:
void foo(int* one, int two) { *one = two; }
и при вызове функции передаем так параметры (&s1, s2);


Ответ

А потому и пишем &, чтобы можно было писать one = two, а не *one = two. Тут вся суть в том, что явно указатель передают когда хотят работать непосредственно с ним, когда нужно знать его значение. Когда же мы хотим работать со значением переменной, но не только в функции в которой она создана, но и в «потомственных», то мы передаём её по ссылке.
Вы конечно можете сказать что-нибудь типа «мне это непривычно, я лучше буду передавать адреса явно», но поверьте — передача переменной по ссылке в случае, если надо работать с самой переменной — правильный подход к программированию. Хороший программист обязан уметь писать ХОРОШИЙ код — не только алгоритмически эффективный, но и максимально понятный; такой, чтобы его суть была понятна другому программисту, даже впервые его увидевшему.
В языке C# передача переменной по ссылке выглядит более красиво, там просто и в вызывающем, и в вызываемом методах перед переменной пишется слово ref (или out, что идёт там по смыслу «дополнительное возвращаемое значение»).

Комментариев нет:

Отправить комментарий