По значению функция получает отдельный параметр, по ссылке — доступ к исходному объекту. Указатель также копируется как значение, но через него можно обращаться к чужому объекту.
Различные методы передачи аргументов в функцию
По значению функция получает отдельный параметр, по ссылке — доступ к исходному объекту. Указатель также копируется как значение, но через него можно обращаться к чужому объекту.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Продемонстрировать несколько вариантов передачи параметров в функцию, раскрыть особенности каждого из них и пояснить, как они влияют на работу программы. При этом следует показать примеры кода, проанализировать, какие значения копируются, а какие передаются по ссылке, и какие последствия это имеет для изменяемости данных внутри функции.
Ответ
По значению функция получает отдельный параметр, по ссылке — доступ к исходному объекту. Указатель также копируется как значение, но через него можно обращаться к чужому объекту.
void byValue(int x) { ++x; }
void byReference(int& x) { ++x; }
void byPointer(int* x) { if (x) ++*x; }
int readOnly(const int& x) { return x; }
Для исходного int n = 1 первый вызов не меняет n, второй и третий могут изменить его. const-ссылка запрещает изменение через этот параметр. Передача объекта по значению может использовать копирование, перемещение или устранение копии; поэтому не всякий такой вызов означает дорогую копию. Сам параметр T&& тоже не выполняет перемещение автоматически.