Здравствуйте, подскажите пожалуйста, как это работает? Допустим, имеется такая функция:
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, что идёт там по смыслу «дополнительное возвращаемое значение»).
Комментариев нет:
Отправить комментарий