Перейти к содержанию

Передача аргументов в функцию

Существуют четыре способа передачи аргументов:

  1. По значению
  2. По указателю
  3. По ссылке
  4. По rvalue-ссылке (для перемещаемых объектов)

В целях повышения безопасности и производительности, рекомендуется:

  • объекты размером до 16 байт (включительно) передавать по значению (https://pvs-studio.ru/ru/docs/warnings/v835/)
  • избегать передачи по указателю
  • использовать ссылки (неконстантные) для возврата значений из функции
  • использовать константные ссылки для возможности передавать временные объекты в функцию
  • использовать rvalue-ссылки для прямой передачи объектов (для перемещения)

Использование указателей в качестве параметров функций

Потенциальная проблема: лишние проверка или неправомерный доступ к памяти (AV, segfault)

Неправильно:

void do_something(Foo* foo)
{
    if (!foo)
        return;
    // Используем указатель
}

В плюсах есть ссылки, которые более безопасны, и позволяют избегать ситуации с использованием нулевого указателя. Например:

void do_something(const Foo& foo)
{
    // Здесь используем ссылку
}

Если нужно использовать нулевые указатели, то исходный указатель заворачиваются в std::unique_ptr и уже этот объект передается по ссылке.

void do_something(const std::unique_ptr<Foo>& foo)
{
    if (!foo)
        return;
    // Используем указатель
}