Передача параметров: значение, ссылка и указатель
Передача по значению
При передаче по значению функция получает отдельный объект. Изменение параметра не изменяет исходную переменную:
void SetZero(int value) { value = 0;}int number = 10;SetZero(number);// number всё ещё равен 10Для небольших типов вроде int, double и bool это обычно хороший выбор.
Передача по ссылке
Ссылка позволяет функции работать с исходным объектом:
void SetZero(int& value) { value = 0;}Для чтения крупного объекта без копирования используй const T&:
void Print(const std::string& text) { std::cout << text << '\n';}Указатель как параметр
Указатель подходит, когда отсутствие объекта имеет смысл (nullptr) или нужно явно передать адрес:
void Reset(int* value) { if (value != nullptr) { *value = 0; }}Если отсутствие объекта не допускается, ссылка часто выражает контракт лучше, чем указатель.
Возврат результата
Не обязательно менять аргумент через ссылку: нередко яснее вернуть новый результат.
int Square(int value) { return value * value;}Возврат по значению обычно эффективен благодаря оптимизациям компилятора и перемещению. Не возвращай ссылку или указатель на локальную переменную: после выхода из функции объект перестанет существовать.
Значения по умолчанию
void Log(const std::string& message, int level = 1);Аргументы по умолчанию обычно указывают в объявлении, доступном вызывающему коду. После параметра со значением по умолчанию все последующие параметры также должны иметь значения по умолчанию.
Итог
Передавай небольшие значения по значению, большие объекты только для чтения — через const-ссылку, а изменяемые данные — через ссылку, если это часть понятного контракта функции.
