- •Об’єкто-орієнтоване
- •Методичні рекомендації та модульні завдання
- •§1. Об’єкт. Структура. Клас.
- •§2. Управління доступом до членів класу
- •§3. Перезавантаження функцій
- •§4. Шаблони функцій
- •§5. Конструктори
- •§6. Статичні члени класу
- •§7. Деструктори
- •§8. Перезавантаження операцій
- •§9. Друзі класу
- •§10. Бінарні й унарні операції
- •§11. Створення класів з підкласами. Агрегація
- •Файл реалізації “Stack.Cpp”
- •§12. Успадкування
- •§13. Ієрархія успадкування класів
- •Модуль 1 (20 балів)
- •Лабораторна робота №1 (6 балів)
- •Тема: Структури. Зовнішні функції і функції-члени структури.
- •Завдання
- •Варіанти завдань
- •Лабораторна робота №2 (6 балів) Тема: Перезавантаження операцій і функцій Завдання
- •Варіанти завдань
- •Лабораторна робота №3 (8 балів) Тема: Структури та класи Завдання
- •Варіанти завдань
- •Варіанти завдань
- •Визначити функції:
- •Визначити функції:
- •Визначити функції:
- •Визначити функції:
- •Визначити функції:
- •Варіанти завдань
- •Лабораторна робота №6 (8 балів) Тема: Абстрактні класи Завдання
- •Варіанти завдань
- •Модуль контроль (15 балів) Теоретичні питання
- •Теоретичні питання
- •Модуль контроль підсумковий (30 балів)
- •Тематика задач
- •Теоретичні питання
- •Розподіл балів і годин
- •Список літератури
- •Навчальне видання
- •Методичні рекомендації та модульні завдання
- •58012, Чернівці, вул. Коцюбинського, 2
§10. Бінарні й унарні операції
Бінарна операція може бути визначена як функція-член, що одержує один параметр або як функція-друг, що одержує два параметри. Таким чином, для будь-якої бінарної операції @ aa@bb може інтерпретуватися як aa.operator@(bb), чи як operator@(aa,bb). Якщо визначені обидві операторні функції, то запис aa@bb є помилкою. Унарна операція, префіксна чи постфіксна, може бути визначена як функція-член, що не одержує параметрів, або як функція-друг, що одержує один параметр. Таким чином, будь-яка унарна операція @ aa@ чи @aa може інтерпретуватися як aa.operator@() або як operator@(aa). Якщо визначена і те, і інше, то і aa@, і @aa є помилками.
Приклад 13:
class X {
// друзі
friend X operator-(X); // унарний мінус
friend X operator-(X,X); // бінарний мінус
friend X operator-(); // помилка: немає операндів
friend X operator-(X,X,X); // помилка: тернарна операція
// члени (з неявним першим параметром: this)
X* operator&(); // унарне & (узяття адреси)
X operator&(X); // бінарне & (логічне множення і)
X operator&(X,X); // помилка: тернарне
};
Коли операції ++ і -- перезавантажуються, префіксне і постфіксне їх використання залежить від програміста.
§11. Створення класів з підкласами. Агрегація
Використання класу або його різновидності – структури всередині іншого класу називається контейнеризацією (агрегецією).
Розглянемо приклад контейнеризації для реалізації стеку, який буде зберігати будь-які типи даних.
Приклад 14:
//: Stack.h
#ifndef STACK_H //якщо не визначена директива STACK_H
#define STACK_H // визначаємо її
class Stack { // об’ява класу Stack
struct Link { // структура, яка об’явлена в класі
void* data;
Link* next;
Link(void* dat, Link* nxt);
~Link();
}* head;
public:
Stack();
~Stack();
void push(void* dat);
void* peek();
void* pop();
};
#endif // кінець визначення директиви STACK_H
//: Stack.cpp
#include "Stack.h"
Stack::Link::Link(void* dat, Link* nxt) {
data = dat;
next = nxt;
}
Stack::Link::~Link() { }
Stack::Stack() { head = 0; }
void Stack::push(void* dat) {
head = new Link(dat,head);
}
void* Stack::peek() {
return head->data;
}
void* Stack::pop() {
if(head == 0) return 0;
void* result = head->data;
Link* oldHead = head;
head = head->next;
delete oldHead;
return result;
}
Stack::~Stack() {
if (head == 0) { printf("Stack not empty");}
}
Надамо деякі пояснення до прикладу. Програма складається з двох файлів: файлу заголовку “Stack.h”, в якому знаходиться опис класу Stack, та файлу “Stack.cpp”, в якому знаходиться реалізація цього класу.
В класі Stack в приватній секції об’явлена структура Link, яка зберігає вказівник на об’єкт (змінна data) та вказівник на наступний елемент (змінна next); вказівник head, який вказує на структуру Link; конструктор Stack() та деструктор ~Stack().
Загальнодоступні функції-члени класу Stack:
push для додавання об’єкта до стеку;
peek для повернення об’єкта;
pop для вилучення об’єкта із стеку.