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 при работе с полиморфизмом — это хорошая привычка.
- Помните: ООП — это не магия, а просто способ организовать ваш код красиво и понятно.
Итоги урока
Теперь вы знаете:- Что такое классы, объекты и методы.
- Как работают конструкторы и деструкторы.
- Что такое инкапсуляция, наследование и полиморфизм.
- Как строить реальные программы с использованием ООП.