1.7Kпросмотров
3 января 2025 г.
Score: 1.9K
Ссылки как параметры Функции, это одна из неотъемлемых частей C++ которою можно встретить в любом проекте.С их помощью можно избегать дублирования, делать код компактным и читаемым.Без функций невозможен полиморфизм(который есть одним из трех основных принципов обьектно-ориентированого-програмирования).Лямбды, шаблоны и тд. станут не доступными без функций. Несколько постов назад я писал про ссылки, и большая их часть используется именно в функциях, а точнее в параметрах.
Во первых разберемся в чем отличие ссылок в параметрах от обычного by value на примере:
void value(int v){ v = 10;
}
void ref(int& r){ r = 20;
} int main(){ int A = 100; value(A); cout<<A<<"\n"; ref(A); cout<<A<<"\n";
}
Вывод:
100
20 Как мы видим, когда мы используем обычную переменную в качестве параметра - ничего не происходит.Но когда изменяем by value на by reference(int v на int& r) значение переменной внутри main изменяется. Но почему так происходит?
А все дело в том, что когда мы передаем в функцию по значению, то мы создаем новую копию того объекта, который внесли в аргумент(в нашем случае переменная по значению это v, а аргумент это A).Но если мы используем в параметре ссылку - мы создаем не копию объекта,а псевдоним/альтернативное имя/синоним/alias.Он не выделяет столько же памяти под новый объект. Имеет ли ссылка память - в стандарте не указано, и на то есть веские причины.Реальный ответ: это зависит от ссылки.Она может быть представлен как обычный указатель, а может и не существовать вообще. Вообщем используя ссылки в параметрах вы не только можете изменять значения, а и используете намного меньше места.Речь идет про объекты, которые занимают много памяти и чтобы их скопировать нужно много ресурсов, хотя зачастую нам совсем не нужно две копии объекта.
Примеры: массивы, большие строки, потоки данных, большие структуры или классы.
Если же мы говорим про дату, которая почти ничего не занимает(например int), разницы вы практически не заметите. Но что если вам не нужно изменять значение в функции, а требуется сам объект для дальнейших вычисленний и сравнений.Не проще будет использовать константные ссылки?
Про константные ссылки следующий пост.