Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

12.1. Базові поняття класу

Клас визначає новий тип даних, який задає формат об'єкта. Клас містить як дані, так і програмні коди, призначені для виконання дій над цими даними. Отже, клас пов'язує дані з програмними кодами. У мові програмування C++ специфікацію класу використовують для побудови об'єктів. Об'єкти – це примірники класу. По суті, клас є набором планів, які вказують на властивості та визначають поведінку об'єкта. Важливо розуміти, що клас – це логічна абстракція, яка реально не існує доти, доки не буде створено об'єкт цього класу, тобто це те, що стане фізичним представленням цього класу в пам'яті комп'ютера.

Об'єктно-орієнтоване програмування побудоване на понятті класу.

Визначаючи клас, оголошуються дані, які він містить, і програмні коди, які виконуватимуться над цими даними. Хоча інколи прості класи можуть містити тільки програмні коди або тільки дані, проте більшість реальних класів містять обидва компоненти. У класі дані оголошуються у вигляді змінних, а програмні коди оформляються у вигляді функцій. Функції та змінні, що утворюють клас, називаються його членами. Таким чином, змінну, оголошену в класі, називають членом даних, а функцію, оголошену в класі, – функцією-членом. Іноді замість терміна член даних класу використовують термін змінна примірника (або змінна реалізації), а замість терміна функція-член класу використовують термін метод класу.

Оголошення класу починається з ключового слова class.

Оголошення класу синтаксично є подібним до оголошення структури. Загальні формати оголошення класу мають такий вигляд:

Варіант 1

Варіант 2

class ім'я_класу {

закриті дані та функції

public:

відкриті дані та функції

} список_об'єктів_класy;

class ім'я_класу {

закриті дані та функції

public:

відкриті дані та функції

};

ім'я_класу список_об'єктів_класy;

Тут елемент ім'я_класу означає ім'я "класового" типу. Воно стає ім'ям нового типу, яке можна використовувати для побудови нових об'єктів класу. Об'єкти класу можна створити шляхом вказання їх імен безпосередньо за закритою фігурною дужкою оголошення класу як елемент список_об'єктів_класу (варіанти 1). Після оголошення класу його об'єкти можна створювати в міру потреби (варіант 2).

Наприклад, так клас визначає тип chergaClass, який призначено для реалізації черги1:

class chergaClass { // Оголошення класового типу

int qpMas[100];

int sloc, rloc;

public:

void init(); // Ініціалізація класу chergaClass.

void putQp(int izm); // Введення в чергу значення.

int getQp(); // Виведення з черги значення.

};

Розглянемо детально механізм визначення цього класу.

Усі члени класу chergaClass оголошені в тілі настанови class. Членами даних класу chergaClass є змінні qpMas[], sloc і rloc. Окрім того, тут визначено три функції-члени: init() – ініціалізація класу, putQp() – введення в чергу значення і getQp() – виведення з черги значення.

За замовчуванням члени класу є закритими (private-членами).

Будь-який клас може містити як закриті, так і відкриті члени. За замовчуванням усі члени, визначені в класі, є закритими. Наприклад, змінні qpMas[], sloc і rloc є закритими. Це означає, що до них можуть отримати доступ тільки інші функції-члени класу chergaClass; ніякі інші частини програми цього зробити не можуть. У цьому полягає один з проявів інкапсуляції: програміст повною мірою може керувати доступом до певних елементів даних. Закритими можна оголосити і функції (у наведеному прикладі таких немає), внаслідок чого їх зможуть викликати тільки інші члени цього класу.

Ключове слово public використовують для оголошення відкритих членів класу.

Щоб зробити члени класу відкритими (тобто доступними для інших частин програми), необхідно визначити їх після ключового слова public. Усі змінні або функції, визначені після специфікатора public, є доступними для всіх інших функцій програми, в тому числі і функції main(). Отже, в класі chergaClass функції init(), putQp() і getQp() є відкритими. Зазвичай у програмі організовується доступ до закритих членів класу через його відкриті функції. Звернемо Вашу увагу на те, що після ключового слова public знаходиться двокрапка.

Варто знати! Об'єкт утворює свого роду зв'язки між кодами програми і її даними. Так, будь-яка функція-член класу має доступ до закритих елементів класу. Це означає, що функції init(), putQp() і getQp() мають доступ до змінних qpMas[], sloc і rloc. Щоб додати будь-яку функцію в клас, необхідно оголосити її прототип в оголошенні цього класу, після чого вона стає функцією-членом класу.

Оголосивши клас, можна створити об'єкт цього "класового" типу, якщо використати ім'я класу. Таким чином, ім'я класу стає специфікатором нового типу. Наприклад, у процесі виконання такої настанови створюється два об'єкти A_ob і B_ob типу chergaClass:

chergaClass A_ob, B_ob; // Створення об'єктів класу

Після створення кожен об'єкт класу набуває власну копію членів-даних, які утворюють клас. Це означає, що кожний з об'єктів A_ob і B_ob матиме власні копії змінних qpMas[], sloc і rloc. Отже, дані, пов'язані з об'єктом A_ob, відокремлені (ізольовані) від даних, які є пов'язані з об'єктом B_ob.

Щоб отримати доступ до відкритого члена класу через об'єкт цього класу, використовують оператор "крапка" (саме так це робиться і під час роботи із структурами). Наприклад, щоб вивести на екран значення змінної sloc, яка належить об'єкту A_ob, використовують таку настанову:

cout << " A_ob.sloc= " << A_ob.sloc;

Необхідно пам'ятати. У мові програмування C++ клас створює новий тип даних, який можна використовувати для побудови об'єктів. Зокрема, клас створює логічну конструкцію, яка визначає відносини між її членами – даними і кодами функцій. Оголошуючи так звану змінну класу, ми створюємо об'єкт, який фізично існує і є конкретним примірником класу1. Понад це, кожен об'єкт класу має власну копію даних, визначених у цьому класі.

У оголошенні класу chergaClass містяться прототипи функцій-членів класу. Щоб реалізувати код функції, яка є членом класу, необхідно повідомити компілятор, до якого класу вона належить, кваліфікувавши ім'я цієї функції з іменем відповідного класу. Наприклад, ось як можна записати код функції putQp():

// Введення в чергу значення.

void chergaClass::putQp(int izm)

{

if(sloc == 100) {

cout << "Черга заповнена.\n";

return;

}

sloc++;

qpMas[sloc] = izm;

}

По суті, такий запис повідомляє компілятор, що дана версія функції putQp() належить класу chergaClass. Іншими словами, оператор дозволу "::" заявляє про те, що функція putQp() знаходиться у області видимості класу chergaClass. Різні класи можуть використовувати однакові імена функцій. Компілятор самостійно визначить, до якого класу належить та чи інша функція за допомогою імені класу та оператора дозволу області видимості.

Оператор дозволу області видимості "::" кваліфікує ім'я члена разом з іменем його класу.

Функції-члени класу можна викликати тільки зі своїми об'єктами. Щоб викликати функцію-члена з частини програми, яка знаходиться поза класом, необхідно використовувати ім'я об'єкта і оператор "крапка". Наприклад, у процесі виконання такого коду програми буде викликано функцію init() для об'єкта A_ob:

chergaClass A_ob, B_ob;

A_ob.init();

Під час виклику функції A_ob.init() дії, визначені у функції init(), будуть спрямовані на копії даних, що належать об'єкту A_ob. Необхідно мати на увазі, що A_ob і B_ob – це два окремі об'єкти. Це означає, що, наприклад, ініціалізація об'єкта A_ob зовсім не приводить до ініціалізації членів-даних об'єкта B_ob. Єдине, що зв'язує об'єкти A_ob і B_ob, це те, що вони мають один і той самий тип.

Якщо одна функція-член класу викликає іншу функцію-члена того ж свмого класу, то не потрібно вказувати ім'я об'єкта і використовувати оператор "крапка". У цьому випадку компілятор вже точно знає, який об'єкт піддається обробленню. Ім'я об'єкта і оператор "крапка" необхідні тільки тоді, коли функція-член класу викликається кодом програми, розташованим поза класом. З тих самих причин функція-член класу може безпосередньо звертатися до будь-якого члена даних свого класу, але програмний код, розташований поза класом, повинен звертатися до змінної класу, використовуючи ім'я об'єкта і оператор "крапка".

У наведеному нижче коді програми механізм оголошення та застосування класу chergaClass продемонстровано повністю. Для цього об'єднано всі разом вже знайомі Вам частини коду програми і додано відсутні деталі.

Код програми 12.1. Демонстрація способу оголошення та застосування класу chergaClass

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

class chergaClass { // Оголошення класового типу

int qpMas[100];

int sloc, rloc;

public:

void init(); // Ініціалізація класу

void putQp(int izm); // Введення в чергу значення

int getQp(); // Виведення з черги значення

};

// Ініціалізація класу chergaClass.

void chergaClass::init()

{

rloc = sloc = 0;

}

// Введення в чергу значення.

void chergaClass::putQp(int izm)

{

if(sloc == 100) {

cout << "Черга заповнена.\n";

return;

}

sloc++;

qpMas[sloc] = izm;

}

// Виведення з черги значення.

int chergaClass::getQp()

{

if(rloc == sloc) {

cout << "Черга порожня.\n";

return 0;

}

rloc++;

return qpMas[rloc];

}

int main()

{

chergaClass A_ob, B_ob; // Створення двох об'єктів класу.

A_ob.init();

B_ob.init();

A_ob.putQp(10);

B_ob.putQp(19);

A_ob.putQp(20);

B_ob.putQp(1);

cout << "Вміст черги A_ob: ";

cout << A_ob.getQp() << " ";

cout << A_ob.getQp() << "\n";

cout << "Вміст черги B_ob: ";

cout << B_ob.getQp() << " ";

cout << B_ob.getQp() << "\n";

getch(); return 0;

}

У процесі виконання ця програма відображає на екрані такі результати:

Вміст черги A_ob: 10 20

Вміст черги B_ob: 19 1

Необхідно пам'ятати! Закриті члени класу доступні тільки функціям, які є членами цього класу.

Наприклад, таку настанову

A_ob.rloc = 0;

не можна включити у функцію main() нашої програми.