10. Основы ООП

Что такое ООП

ООП (объектно-ориентированное программирование) — это подход к написанию кода, где программа состоит из объектов. Каждый объект описывает конкретную сущность: человека, машину, животное, пользователя сайта и т.д.
ООП позволяет моделировать реальный мир с помощью кода. Например, класс «Автомобиль» может иметь свойства (скорость, цвет) и методы (ехать, тормозить).

Основные принципы ООП

  • Инкапсуляция — скрытие деталей реализации и защита данных.
  • Наследование — возможность создавать новые классы на основе существующих.
  • Полиморфизм — способность объектов разных классов иметь одинаковые методы, но разное поведение.

Классы и объекты

Класс — это шаблон, по которому создаются объекты. Объект — это конкретный экземпляр класса.

Пример простого класса


#include <iostream>
#include <string>
using namespace std;

class Person { public: string name; int age;

void sayHello() { cout << "Привет! Меня зовут " << name << ", мне " << age << " лет." << endl; } };

int main() { Person p1; p1.name = "Анна"; p1.age = 25; p1.sayHello();

Person p2; p2.name = "Иван"; p2.age = 30; p2.sayHello(); return 0; }

Результат

Привет! Меня зовут Анна, мне 25 лет. Привет! Меня зовут Иван, мне 30 лет.

Конструктор и деструктор

Конструктор — это специальный метод, который вызывается при создании объекта. Деструктор — вызывается при уничтожении объекта.

#include <iostream>
#include <string>
using namespace std;

class Person { public: string name; int age;

Person(string n, int a) { // конструктор name = n; age = a; cout << "Создан объект: " << name << endl; }

~Person() { // деструктор cout << "Удалён объект: " << name << endl; }

void sayHello() { cout << "Привет, я " << name << endl; } };

int main() { Person user1("Анна", 22); user1.sayHello(); return 0; }

Результат

Создан объект: Анна Привет, я Анна Удалён объект: Анна

Инкапсуляция

Инкапсуляция защищает внутренние данные класса от прямого доступа. Для этого используется модификатор доступа private.

#include <iostream>
#include <string>
using namespace std;

class BankAccount { private: double balance;

public: BankAccount(double initial) { balance = initial; }

void deposit(double amount) { balance += amount; }

void withdraw(double amount) { if (amount <= balance) balance -= amount; else cout << "Недостаточно средств!" << endl; }

double getBalance() { return balance; } };

int main() { BankAccount acc(1000); acc.deposit(500); acc.withdraw(300); cout << "Баланс: " << acc.getBalance() << endl; return 0; }

Наследование

Наследование позволяет создавать новые классы, основываясь на существующих.

#include <iostream>
#include <string>
using namespace std;

class Animal { public: void speak() { cout << "Животное издаёт звук" << endl; } };

class Dog : public Animal { public: void bark() { cout << "Собака лает: Гав-гав!" << endl; } };

int main() { Dog d; d.speak(); d.bark(); return 0; }

Результат

Животное издаёт звук Собака лает: Гав-гав!

Полиморфизм

Полиморфизм позволяет использовать один и тот же интерфейс для разных объектов.

#include <iostream>
using namespace std;

class Shape { public: virtual void draw() { cout << "Рисуем фигуру" << endl; } };

class Circle : public Shape { public: void draw() override { cout << "Рисуем круг" << endl; } };

class Square : public Shape { public: void draw() override { cout << "Рисуем квадрат" << endl; } };

int main() { Shape* s1 = new Circle(); Shape* s2 = new Square();

s1->draw(); s2->draw();

delete s1; delete s2; return 0; }

Результат

Рисуем круг Рисуем квадрат

Мини-проект: система пользователей


#include <iostream>
#include <string>
using namespace std;

class User { protected: string name;

public: User(string n) { name = n; } virtual void info() { cout << "Пользователь: " << name << endl; } };

class Admin : public User { public: Admin(string n) : User(n) {} void info() override { cout << "Администратор: " << name << endl; } void banUser(string user) { cout << "Пользователь " << user << " заблокирован!" << endl; } };

int main() { User u1("Анна"); Admin a1("Иван");

u1.info(); a1.info(); a1.banUser("Анна"); return 0; }

Типичные ошибки новичков

  • Забывают добавить public при наследовании, и методы базового класса становятся недоступными.
  • Создают объект без конструктора, но обращаются к полям, которые не инициализированы.
  • Не ставят virtual при полиморфизме, и вызывается не тот метод.

Советы новичкам

  • Пишите короткие классы, каждый должен выполнять одну задачу.
  • Используйте protected для того, что нужно в наследниках, и private — для внутренней логики.
  • Используйте virtual и override при работе с полиморфизмом — это хорошая привычка.
  • Помните: ООП — это не магия, а просто способ организовать ваш код красиво и понятно.

Итоги урока

Теперь вы знаете:
  • Что такое классы, объекты и методы.
  • Как работают конструкторы и деструкторы.
  • Что такое инкапсуляция, наследование и полиморфизм.
  • Как строить реальные программы с использованием ООП.