Клас та обʼєкт в ООП; конструктор/деструктор; інтерфейс і реалізація

Розділ: Основи мов програмування

📌 Про що ця тема


Тут перевіряють розуміння основ обʼєктно-орієнтованого програмування (ООП): що таке клас і обʼєкт, як обʼєкт створюється й знищується (конструктор/деструктор) і чому «інтерфейс» (що можна робити) відокремлюють від «реалізації» (як саме це зроблено). Ключове поняття — інкапсуляція: обʼєднання даних і методів у єдиній сутності.


📖 Головне


• Клас — це опис (шаблон, тип) майбутніх обʼєктів: які в них будуть дані й дії. Сам по собі клас памʼяті під дані не займає.

• Обʼєкт (екземпляр) — конкретна «річ», створена за класом. З одного класу можна зробити багато обʼєктів з різними значеннями.

• Поля (атрибути, властивості) — дані обʼєкта (напр. колір, розмір). Методи — дії, які обʼєкт уміє виконувати (функції всередині класу).

• Інкапсуляція — обʼєднання полів і методів разом та приховування внутрішніх деталей. Доступ регулюють модифікатори: private (видно лише всередині класу), public (видно ззовні), protected (видно в класі й нащадках).

• Конструктор — спеціальний метод, що автоматично викликається під час створення обʼєкта. Його задача — задати початкові значення полів. Може приймати параметри; їх може бути кілька (перевантаження).

• Деструктор — метод, що викликається, коли обʼєкт знищується (виходить з області видимості або памʼять звільняється). Задача — прибрати за собою: звільнити ресурси, файли, памʼять.

• Інтерфейс — зовнішній «договір»: перелік доступних полів і методів, тобто ЩО обʼєкт уміє і як до нього звертатися, без деталей.

• Реалізація — внутрішній код методів: ЯК саме дія виконується. Її можна змінити, не ламаючи інтерфейс.

• Переваги розділення: можна правити реалізацію, не чіпаючи програму, яка користується класом; код легше супроводжувати й повторно використовувати.

• Три кити ООП взагалі: інкапсуляція, успадкування, поліморфізм (у цій темі головна — інкапсуляція).


🔢 Як це працює на прикладі


Клас «Прямокутник» (псевдокод):

• Поля (private): width, height.

• Конструктор: Rectangle(w, h) → width = w; height = h.

• Методи (public): area() повертає width*height; perimeter() повертає 2*(width+height).

• Деструктор: ~Rectangle() — напр., виводить «обʼєкт знищено».


Робота:

1) Створюємо обʼєкт r = Rectangle(4, 3). Спрацьовує конструктор: width=4, height=3.

2) Викликаємо r.area() → 4*3 = 12.

3) r.perimeter() → 2*(4+3) = 14.

4) Коли r більше не потрібен — викликається деструктор.


Тут інтерфейс — це area(), perimeter(), конструктор; реалізація — формули всередині. Користувачу класу байдуже, як рахується площа.


⚠️ Типові помилки


• Плутають клас і обʼєкт: клас — опис/тип, обʼєкт — конкретний екземпляр у памʼяті.

• Вважають, що конструктор треба викликати вручну — ні, він спрацьовує сам під час створення обʼєкта.

• Думають, що private-поля недоступні зовсім; доступ до них є через public-методи (гетери/сетери).

• Плутають інтерфейс і реалізацію: інтерфейс — ЩО, реалізація — ЯК.

• Забувають, що один клас породжує багато незалежних обʼєктів зі своїми значеннями полів.


🎯 Що завчити напамʼять


• Клас — шаблон, обʼєкт — екземпляр.

• Конструктор ініціалізує, викликається при створенні; деструктор прибирає, при знищенні.

• Модифікатори: private / public / protected.

• Інкапсуляція = дані + методи + приховування деталей.

• Інтерфейс = ЩО; реалізація = ЯК.


🧠 Перевір себе


1. Чим клас відрізняється від обʼєкта?

2. Коли автоматично викликаються конструктор і деструктор?

3. Що приховує модифікатор private і як тоді дістатися до поля?

4. Навіщо відокремлювати інтерфейс від реалізації?


Відповіді: 1 — клас це опис/тип, обʼєкт це конкретний екземпляр, створений за класом; 2 — конструктор при створенні обʼєкта, деструктор при його знищенні; 3 — private ховає поле від коду ззовні класу, доступ дають через public-методи (гетери/сетери); 4 — щоб можна було змінювати внутрішній код, не ламаючи програми, які користуються класом.

Перевірити себе на практиці

Прочитати — половина справи. Далі потрібні завдання цієї ж теми з розбором кожної відповіді: саме на них видно, чи справді тема закрита.