Что такое ООП (объектно-ориентированное программирование)?

«Что такое ООП (объектно-ориентированное программирование)?» — вопрос из категории ООП, который задают на 34% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ООП — это парадигма программирования, в которой программа структурируется вокруг объектов, объединяющих данные (поля, атрибуты) и поведение (методы, функции), которые над этими данными оперируют. В C++ это реализуется через классы.

Четыре основных принципа ООП в C++:

  1. Инкапсуляция: Сокрытие внутреннего состояния объекта и деталей реализации от внешнего кода. Доступ осуществляется через публичный интерфейс.

    class BankAccount {
    private: // Скрытая реализация
        double balance;
        std::string accountNumber;
    public: // Публичный интерфейс
        void deposit(double amount) {
            if (amount > 0) balance += amount;
        }
        double getBalance() const { return balance; } // Геттер
    };
  2. Наследование: Возможность создания нового класса (производного) на основе существующего (базового), заимствуя его поля и методы, и расширяя или изменяя их.

    // Базовый класс
    class Vehicle {
    public:
        void startEngine() { /* общая реализация */ }
    };
    // Производный класс
    class Car : public Vehicle {
    public:
        void openSunroof() { /* специфичное для Car */ }
    };
    // Car теперь имеет методы startEngine() и openSunroof().
  3. Полиморфизм: Способность объектов с одинаковым интерфейсом (например, унаследованным от одного базового класса) вести себя по-разному. В C++ достигается через виртуальные функции.

    class Shape {
    public:
        virtual void draw() const = 0; // Чисто виртуальная функция
        virtual ~Shape() = default; // Виртуальный деструктор
    };
    
    class Circle : public Shape {
    public:
        void draw() const override { std::cout << "Drawing a circlen"; }
    };
    
    class Square : public Shape {
    public:
        void draw() const override { std::cout << "Drawing a squaren"; }
    };
    
    // Полиморфное поведение
    void renderShape(const Shape& sh) {
        sh.draw(); // Вызовется правильная версия draw() в зависимости от типа объекта
    }
  4. Абстракция: Моделирование ключевых характеристик сущности, игнорируя нерелевантные детали. Абстрактные классы (с чисто виртуальными функциями, как Shape выше) — прямой инструмент абстракции в C++.

Видео-ответы