Какие парадигмы программирования поддерживает C++?

«Какие парадигмы программирования поддерживает C++?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

C++ — мультипарадигменный язык, поддерживающий несколько стилей программирования, которые можно комбинировать:

  1. Процедурное программирование: Организация кода вокруг функций и глобальных данных. Это основа многих legacy-систем на C++.

    double calculateCircleArea(double radius) {
        return 3.14159 * radius * radius;
    }
  2. Объектно-ориентированное программирование (ООП): Использование классов для инкапсуляции данных и поведения, наследования и полиморфизма.

    class Shape {
    public:
        virtual double area() const = 0; // Чисто виртуальная функция
        virtual ~Shape() = default;
    };
  3. Обобщенное программирование: Использование шаблонов (templates) для написания типонезависимого кода. Это основа STL.

    template <typename T>
    T clamp(const T& value, const T& low, const T& high) {
        return (value < low) ? low : (value > high) ? high : value;
    }
  4. Функциональное программирование: Поддержка лямбда-выражений, std::function, алгоритмов, работающих с функциями как с объектами.

    std::vector<int> vec = {1, 2, 3, 4};
    std::transform(vec.begin(), vec.end(), vec.begin(),
                   [](int x) { return x * x; }); // Возводим все элементы в квадрат
  5. Метапрограммирование: Вычисления на этапе компиляции с помощью шаблонов и constexpr.

    // Вычисление факториала во время компиляции
    constexpr size_t factorial(size_t n) noexcept {
        return (n <= 1) ? 1 : (n * factorial(n - 1));
    }
    int array[factorial(5)]; // Массив размером 120
  6. Абстракция данных: Использование классов и структур для создания новых типов, скрывающих детали реализации (например, std::string, std::vector).