- •1. Лабораторна робота 1. "Структури: складені типи даних"
- •Теоретичні відомості
- •1.1.1. Структури
- •1.1.2. Робота з масивом структур
- •1.2. Постановка задачі
- •1.3. Варіанти
- •1.4. Методичні вказівки
- •Постановка задачі.
- •2. Лабораторна робота 2 "Динамічні структури даних"
- •2.1. Теоретичні відомості
- •2.1.1. Списки
- •2.1.2. Стеки
- •2.1.3. Черги
- •2.2. Постановка задачі
- •2.3. Варіанти завдань
- •3.1.2. Члени класу
- •3.1.3. Доступ до членів класу
- •3.1.4. Черги-масиви
- •3.1.5. Стеки-масиви
- •3.2. Постановка задачі
- •3.3. Варіанти завдань
- •3.4. Методичні вказівки
- •4. Лабораторна робота 4. "Перезавантаження конструкторів"
- •4.1. Теоретичні відомості
- •4.1.1. Перезавантаження конструкторів
- •4.1.3. Операції з матрицями
- •4.2. Постановка задачі
- •4.3. Варіанти завдань
- •4.4. Методичні вказівки
- •5. Лабораторна робота 5. "Перезавантаження операторів. Дружні функції"
- •5.1. Теоретичні відомості
- •5.1.1. Дружні функції
- •5.1.1. Перезавантаження операторів
- •5.1.2. Операторні функції для комплексних чисел
- •5.2. Постановка задачі
- •5.3. Варіанти завдань
- •5.4. Методичні вказівки
- •6. Лабораторна робота 6. "Спадкування. Віртуальні функції"
- •6.1 Теоретичні відомості
- •6.1.1. Спадкування й модифікатори спадкування
- •6.1.2. Віртуальні функції
- •6.1.3. Відділення інтерфейсу від реалізації
- •6.2. Постановка задачі
- •6.3. Варіанти завдань
- •6.4. Методичні вказівки
- •7. Лабораторна робота 7. "Шаблони"
- •7.1. Теоретичні відомості
- •7.1.1. Шаблони функцій
- •7.1.2. Шаблони класів
- •7.1.3. Приклад. Методи шаблона вектора
- •7.1.4. Приклад. Шаблон класу зв'язного списку
- •7.2. Постановка задачі
- •7.3. Варіанти завдань
- •7.4. Методичні вказівки
- •8. Лабораторна робота 8. "Файловий введення-виведення"
- •8.1. Теоретичні відомості
- •8.1.2. Потоки й файли
- •8.1.3. Текстові файли. Форматоване введення-виведення
- •8.1.4. Неформатоване двійкове введення-виведення
- •8.1.5. Файли довільного доступу
- •8.2. Постановка задачі
- •8.3. Варіанти завдань
- •8.4. Методичні вказівки
- •Література
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;
}