Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мет_2 часть_укр.doc
Скачиваний:
1
Добавлен:
09.11.2019
Размер:
938.5 Кб
Скачать

3.1.2. Члени класу

Мітка public: у наведеному вище прикладі ділить тіло класу на дві частини. Імена в першій, закритій частині, можуть використатися тільки функціями-членами класу. Друга, відкрита частина, що розміщена після public, становить інтерфейс до об'єкта класу. За умовчанням всі члени класу є закритими.

У визначенні класу містяться прототипи функцій-членів (але можуть розміщатися й визначення функцій-членів). Якщо в класі зазначений тільки прототип функції, то визначення функції записується поза класом відповідно синтаксису:

Тип_функції Ім'я_класу :: Ім'я_функції (Список_параметрів) {

/*Тіло_функції*/

}

Функція-член виведення даних на екран, яка належить класу Date, може мати наступний вид:

void Date :: print() {

cout << day << "." <<month << "." << year;

}

Операція розширення області видимості :: кваліфікує print() як фун­кцію-член класу Date.

Перед кожним членом може стояти мітка, нею може бути не тільки public, але й ключові слова private і protected. Ці мітки – специфікатори доступу до членів класу:

private – мітка для закритих членів класу які доступні тільки функціям-членам даного класу або членам класів-"друзів". Це специфікація за умовчанням.

protected – для свого класу ця мітка рівнозначна private, але члени із цією міткою доступні для членів даного класу й класів-друзів, а також для членів похідних класів.

public – члени із цією міткою є відкритими, тобто доступні при звертанні до об'єкта з будь-якого місця програми, де даний клас є видимим.

У визначенні класу в розділі public обов'язково міститься функція з тим ім'ям, що й клас (Date). Це конструктор класу – спеціальна функція-член, що ініціалізує дані-члени об'єкта цього класу. Конструктор викликається автоматично при створенні об'єкта. Для конструктора не вказується тип, що повертається, оскільки конструктор створює сам об'єкт даного класу (тобто типу). Функція конструктора описується в такий спосіб:

Date :: Date() { /* тіло функції */ }

Крім конструктора у визначенні класу може міститися (але не обов'язково) деструктор – функція, яка викликається при руйнуванні об'єкта. Ім'я деструктора співпадає з ім'ям конструктора й випереджається позначкою тильда: ~Date().

3.1.3. Доступ до членів класу

Закриті члени класу можуть бути доступні тільки для функцій-членів цього класу. Відкриті члени класу доступні для будь-яких функцій у програмі.

Операції, що забезпечують доступ до членів класу, аналогічні операціям доступу до членів структури. Припустимо, що оголошені об'єкт і покажчик на об'єкт класу Date:

Date current, *pcurr;

Доступ до функції-члена print() забезпечується через ім'я об'єкта як

current.print();

і через покажчик на об'єкт як

pcurr->print();

3.1.4. Черги-масиви

Розглянемо реалізацію класів на прикладі черг і стеків, знайомих із лабораторній роботі 2. Але тут черги й стеки будуть створюватися не як динамічні структури на основі списків, а на основі статичних масивів.

Оголосимо константну змінну capacity, що задає максимальний розмір черги-масиву, і тип даних el, що визначає тип елементів масиву:

const int capacity = 128;

typedef int el;

Оголошення класу черги запишемо у вигляді:

class Queue {

public:

Queue(); //Конструктор

bool empty();

void enqueue(const el & value);

el front();

void dequeue();

private:

el arr[capacity]; //Масив елементів

int qFront; //Початок черги

qBack; //Кінець черги

};

Опишемо функції-члени класу Queue. Конструктор установлює початок і кінець черги на перший елемент масиву:

inline Queue :: Queue(){

qBack=0;

qFront=0;

}

Функція empty визначає, чи порожня черга:

inline bool Queue :: empty() {

return (qBack == qFront);

}

Функція enqueue додає елемент у чергу:

void Queue :: enqueue(const el & value) {

if (qBack == capacity){

cerr << "Queue is full!" << endl;

return;

}

arr[qBack]=value;

qBack++;

}

Функція dequeue видаляє елемент із черги:

void Queue :: dequeue() {

if ( !empty()) {

qFront++;

} else {

cerr << "Queue is empty!" << endl;

}

}

Функція front повертає перший елемент черги:

el Queue :: front() {

if (!empty()) {

return (arr[qFront]);

} else {

cerr << "Queue is empty!" << endl;

return NULL;

}

}

Функція print , яка не входить в клас, друкує елементи черги:

void print(Queue QC) {

while ( !QC.empty() ) {

cout << " " << QC.front();

QC.dequeue();

}

cout << endl;

}