Тема 2. Класи мовою С++ та об’єкти
Зміст теми. Оголошення класу. Заголовок та реалізація. Доступ до членів класу. Створення екземплярів класу (об’єктів). Виклик функцій класу.
Визначення або оголошення класу починається з ключового слова class. Далі у фігурних дужках ({}) описується тіло класу. Визначення класу закінчується крапкою з комою. Тіло класу включає дані (члени-дані), функції (члени-функції) і специфікатори доступу до членів класу. Специфікатори доступу до членів класу завжди закінчуються двокрапкою (:) і можуть з'являтися у визначенні класу багато разів і у будь-якому порядку.
Визначення (оголошення) класу записується таким чином:
class <ім’я класу>
{
[специфікатор доступу:]
<тип атрибуту 1> < ім’я атрибуту 1 >;
<тип атрибуту 2> < ім’я атрибуту 2>;
...
[специфікатор доступу:]
<тип функції 1> < ім’я функції 1>;
<тип функції 2> < ім’я функції 2>;
....
};
Після того, як клас визначений, і його функції-члени оголошені, ці функції-члени повинні бути визначені (описані). Кожна функція-член може бути описана прямо в тілі класу або після тіла класу. Коли функція-член описується після відповідного визначення класу, імені функції передує ім'я класу і оператор дозволу області дії (::). Оскільки різні класи можуть мати члени з однаковими іменами, оператор дозволу області дії «прив'язує» ім'я члена до імені класу, щоб однозначно ідентифікувати функції-члени даного класу.
Хорошим стилем програмування вважається винесення оголошення класу, або інтерфейсу, у файл заголовка, який зазвичай має розширення «.h». Виконання класу, тобто визначення функцій-членів, записується у файл з розширенням «.cpp», який називається реалізацією.
Як було вказано вище, при описі класу можна використовувати специфікатори доступу до членів класу. Специфікатори доступу – це спеціальні синтаксичні конструкції, що явно задають область видимості кожного члена класу. Існують наступні специфікатори доступу:
public – відкритий доступ;
private – закритий доступ;
protected – захищений доступ.
Хороший стиль програмування рекомендує використовувати при визначенні класу кожен специфікатор доступу до елементів тільки один раз, що робить програму яснішою і простішою для читання.
За замовчанням доступ до членів класу – private. Доступ до відкритих членів класу мають будь-які функції в програмі, доступ до закритих членів класу мають тільки члени-функції даного класу і друзі класу. Дані-члени класу зазвичай робляться закритими, а функції-члени – відкритими. Глибокий сенс такого підходу полягає в тому, що дійсне представлення даних усередині класу не торкається клієнтів (користувачів) класу. Клієнти класу використовують клас, не знаючи внутрішніх деталей його реалізації. Якщо реалізація класу змінюється, інтерфейс класу залишається незмінним і дійсний код клієнта класу не вимагає змін. Це значно спрощує модифікацію систем.
З того, що дані класу закриті, не витікає, що клієнти не можуть змінювати ці дані. Дані можуть бути змінені функціями-членами або друзями цього класу. Наприклад, щоб дозволити клієнтам класу прочитати закрите значення даних, клас може мати функцію «одержати» (get). Щоб дати клієнтам можливість змінювати закриті дані, клас може мати функцію «встановити» (set). Таким чином, доступ до закритих членів класу здійснюється через відкриті члени-функції даного класу.
Основне завдання відкритих членів полягає в тому, щоб дати клієнтам класу уявлення про можливості (послуги), які забезпечує клас. Цей набір послуг складає відкритий інтерфейс класу. Клієнтів класу не повинно торкатися, яким чином клас виконує їх завдання. Закриті члени класу і опис відкритих функцій-членів недоступні для клієнтів класу. Ці компоненти складають реалізацію класу.
Отже, клас - це структурований тип даних, визначений користувачем. Коли клас визначений, ім'я класу може бути використано для оголошення змінної цього типу , які називають екземплярами класу або об'єктами. Функції, що оголошені усередині класу, викликаються ззовні об'єкта даного класу за допомогою оператора вибору елемента «.» або оператора вибору елемента за допомогою покажчика «->».
Наприклад, об'єкт товар характеризується двома атрибутами: найменуванням і ціною. Необхідно ввести з клавіатури дані про товар і вивести їх на екран. Отже, для об'єкта товар можна оголосити клас, що буде містити два поля даних (найменування товару й ціну), і два методи (уведення даних з клавіатури і вивід даних на екран).
Зобразимо клас на мові UML наступним чином:
CTovar
name
price
input()
output()
Рисунок 1 – Зображення класу Товар на UML
Оголосимо клас CTovar:
class CTovar // CTovar- ім'я класу
{
//оголошення членів-даних класу
char name[15]; // найменування товару
float price; // ціна товару
public: // специфікатор доступу (відкритий)
//оголошення членів-функцій класу (методів)
void input(); //функція уведення з клавіатури даних про товар
void output(); //функція виводу на екран даних про товар
};
Далі необхідно визначити (описати) члени-функції. Визначення функцій виконаємо поза класом, тому перед ім'ям функції необхідно вказати ім'я класу.
Приклад опису функції input() поза класом наведений нижче:
void CTovar::input() //оголошення функції input() класу CTovar
{ // початок функції
cout <<"Уведіть найменування товару ";
cin >>name;
cout <<"Уведіть ціну товару ";
cin >>price;
} // кінець функції
Оголошення екземпляра класу або об'єкта з ім’ям Tovar наведено нижче:
CTovar Tovar;
Наприклад, виклик функції output() у функції main() запишеться в такий спосіб:
Tovar.output();
Запитання для самоконтролю
Як здійснюється доступ