В C++ параметры функции (в том числе члены методов) можно передавать:
Пример:
void foo(int value); // по значению void foo(int* ptr); // по указателю void foo(const int& ref); // по ссылке (оптимально для больших объектов!)
При передаче по ссылке возможна реализация оптимизации (copy elision), а для больших объектов рекомендуется const &. Для указателей всегда проверяйте на nullptr.
Чем отличается
const MyClass& objотMyClass objв параметрах функции?
Ответ:
const MyClass& не копирует объект, а лишь предоставляет доступ без возможности изменить (оптимально для больших объектов). MyClass obj всегда делает копию, что накладно при больших размерах или при отсутствии правильного копирования (например, не реализован deep copy).
void process(const std::string& s); // Не копирует void process(std::string s); // Копирует
История В корпоративной библиотеке математических структур программист решил ускорить работу, передавая большие контейнеры по значению. Это вызывало существенные накладные расходы при каждом вызове функции — производительность снизилась вдвое.
История В модуле управления пользователями использовались указатели без проверки на
nullptr. Иногда происходили случайные сбои при обращении к невалидным указателям, отладка заняла месяцы.
История В проекте обработки изображений часть функций принимала объекты по значению, а часть по ссылке. Для одного из классов не был реализован deep copy, что вызывало утечки памяти и неявное совместное владение ресурсами после передачи по значению.