Основные функции

  1. Объявление и определение функций

    • Объявление функции включает указание её возвращаемого типа, имени и списка параметров. Если функция не возвращает значения, используется void. Оно сообщает компилятору о существовании функции.
    int add(int a, int b);  // Объявление функции
    • Определение функции включает реализацию её тела.
    int add(int a, int b) {
        return a + b;
    }
  2. Параметры функции — переменные, передаваемые функции. Они могут быть переданы по значению, по ссылке или указателю.

    • Передача по значению:

      void foo(int x) {
          x = 5;  // Изменения не затрагивают исходную переменную
      }
    • Передача по ссылке:

      void foo(int &x) {
          x = 5;  // Изменения затрагивают исходную переменную
      }
    • Передача указателя:

      void foo(int *x) {
          *x = 5;  // Изменения затрагивают исходную переменную через указатель
      }

Общие рекомендации по написанию функций

  1. Ясность и читаемость

    • Давайте функциям осмысленные имена, которые отражают их назначение.
    • Используйте комментирование для объяснения сложной логики.
  2. Единичная ответственность

    • Каждая функция должна выполнять только одну задачу или ответственность. Это облегчает понимание и тестирование функций.
  3. Минимизация параметров

    • Старайтесь уменьшить количество параметров функции. Если функция принимает много параметров, рассмотрите возможность использования структур или классов для их группировки.
  4. Использование const там, где это возможно

    • Используйте ключевое слово const для параметров, которые не должны изменяться, а также для методов, которые не изменяют состояние объекта.
    void printMessage(const std::string &message) {
        std::cout << message << std::endl;
    }
  5. Возвращение значений

    • Избегайте использования глобальных переменных для передачи данных между функциями. Вместо этого возвращайте значения через параметры или используя возвращаемый тип функции.
  6. Обработка ошибок

    • Продумывайте и реализуйте механизмы обработки ошибок. Используйте исключения (exceptions) или возвращаемые значения для индикации ошибок.
  7. Рекурсивные функции

    • Рекурсия может быть мощным инструментом, но используйте её осторожно. Убедитесь, что каждая рекурсивная функция имеет базовый случай для завершения.
  8. Оптимизация производительности

    • Профилируйте и оптимизируйте функции, которые критичны для производительности, но избегайте преждевременной оптимизации. Сначала пишите ясный и корректный код.

Пример функции

#include <iostream>
#include <vector>
 
// Функция для вычисления среднего значения элементов вектора
double calculateAverage(const std::vector<int> &numbers) {
    if (numbers.empty()) {
        return 0.0;  // Обработка пустого вектора
    }
 
    int sum = 0;
    for (int num : numbers) {
        sum += num;
    }
 
    return static_cast<double>(sum) / numbers.size();
}
 
int main() {
    std::vector<int> myNumbers = {1, 2, 3, 4, 5};
    double average = calculateAverage(myNumbers);
    std::cout << "Среднее значение: " << average << std::endl;
    return 0;
}