Изучение объектно-ориентированного программирования на C++: руководство для начинающих

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

  1. Классы и объекты.
    В основе ООП в C++ лежат классы и объекты. Класс — это план или шаблон для создания объектов, а объект — это экземпляр класса. Давайте рассмотрим пример:
#include <iostream>
class Car {
public:
    std::string brand;
    std::string color;
    int year;
    void drive() {
        std::cout << "Driving the " << brand << " car!" << std::endl;
    }
};
int main() {
    Car myCar;
    myCar.brand = "Ford";
    myCar.color = "Blue";
    myCar.year = 2022;

    myCar.drive();
    return 0;
}

В этом примере мы определяем класс под названием «Автомобиль» с атрибутами (марка, цвет и год) и функцией-членом (привод). Мы создаем объект класса Car под названием «myCar» и получаем доступ к его атрибутам и функции-членам с помощью оператора точки.

  1. Наследование:
    Наследование позволяет создать новый класс (производный класс) на основе существующего класса (базового класса). Производный класс наследует атрибуты и функции-члены базового класса. Вот пример:
class ElectricCar : public Car {
public:
    int batteryCapacity;
    void charge() {
        std::cout << "Charging the electric car!" << std::endl;
    }
};
int main() {
    ElectricCar myElectricCar;
    myElectricCar.brand = "Tesla";
    myElectricCar.color = "Red";
    myElectricCar.year = 2023;
    myElectricCar.batteryCapacity = 75;
    myElectricCar.drive();
    myElectricCar.charge();
    return 0;
}

В этом примере мы определяем производный класс под названием «ElectricCar», который наследуется от базового класса «Car». Класс ElectricCar имеет дополнительный атрибут (batteryCapacity) и функцию-член (charge). Мы создаем объект класса ElectricCar и получаем доступ как к функции-члену базового класса (привод), так и к функции-члену производного класса (заряд).

  1. Полиморфизм:
    Полиморфизм позволяет рассматривать объекты разных классов как объекты общего базового класса. Это позволяет вам писать код, который может работать с объектами нескольких типов. Вот пример:
class Vehicle {
public:
    virtual void sound() {
        std::cout << "Vroom!" << std::endl;
    }
};
class Motorcycle : public Vehicle {
public:
    void sound() override {
        std::cout << "Vroom vroom!" << std::endl;
    }
};
class Truck : public Vehicle {
public:
    void sound() override {
        std::cout << "Honk honk!" << std::endl;
    }
};
int main() {
    Vehicle* vehicles[3];
    vehicles[0] = new Vehicle();
    vehicles[1] = new Motorcycle();
    vehicles[2] = new Truck();
    for (int i = 0; i < 3; i++) {
        vehicles[i]->sound();
    }
    return 0;
}

В этом примере мы определяем базовый класс под названием «Транспортное средство» с виртуальной функцией-членом (звуком). Затем мы создаем два производных класса: «Мотоцикл» и «Грузовик», которые переопределяют функцию звука. Мы используем массив указателей на базовый класс для хранения объектов разных типов (автомобиль, мотоцикл и грузовик) и вызываем функцию звука. Соответствующий звук определяется динамически во время выполнения на основе фактического типа объекта.

  1. Инкапсуляция:
    Инкапсуляция — это практика сокрытия деталей внутренней реализации и предоставления общедоступного интерфейса для взаимодействия с объектами. Это помогает добиться абстракции и защиты данных. Вот пример: