- •5.05010301 „Розробка програмного забезпечення”
- •Приклади
- •Приклад
- •Завдання 2
- •Лабораторна робота №2. Перевантаження операцій.
- •1.Абстрактний тип даних (атд).
- •2.Перевантаження операцій.
- •Лабораторна робота №3. Успадкування і віртуальні функції
- •Лабораторна робота №4 Ієрархія об'єктів і групи. Ітератори.
- •Студент Викладач Кафедра Студентська група Зав. Кафедрою Факультет
- •Лабораторна робота №5. Обробка подій.
- •Об'єкт-калькулятор, що працює з цілими числами
- •Лабораторна робота №5. Реалізація етапів ооп.
- •4.Що таке EasyWin програма?
- •Лабораторна робота №6. Шаблони функцій і класів.
- •Лабораторна робота №7. Потокові класи.
- •Лабораторна робота №8 Стандартна бібліотека шаблонів
- •3.Класи-контейнери.
- •Операції, що не модифікують
- •Операції, що модифікують
- •Сортування
- •Робота з множинами
- •Мінімуми і максимуми
- •Перестановки
- •Список рекомендованої літератури а) Основна
- •А) Додаткова
Лабораторна робота №2. Перевантаження операцій.
Мета. Одержати практичні навички створення абстрактних типів даних і перевантаження операцій у мові С++.
Основний зміст роботи.
Визначити і реалізувати клас — абстрактний тип даних. Визначити і реалізувати операції над даними цього класу. Написати і виконати EasyWin програму повного тестування цього класу.
Короткі теоретичні відомості.
1.Абстрактний тип даних (атд).
Тип даних, обумовлений тільки через операції, що можуть виконуватися над відповідними об'єктами без відношення до способу представлення цих об'єктів.
АТД містить у собі абстракцію як через параметризацію, так і через специфікацію. Абстракція через параметризацію може бути здійснена так само як і для процедур (функцій) використанням параметрів там, де це має сенс. Абстракція через специфікацію досягається за рахунок того, що операції представляються як частина типу.
Для реалізації АТД необхідно, по-перше, вибрати представлення пам'яті для об'єктів і, по-друге, реалізувати операції в термінах обраного представлення.
Прикладом абстрактного типу даних є клас у мові С++.
2.Перевантаження операцій.
Можливість використовувати знаки стандартних операцій для запису виразів як для вбудованих, так і для АТД.
У мові С++ для перевантаження операцій використовується ключове слово operator, за допомогою якого визначається спеціальна операція-функція (operator function).
Формат операції-функції:
тип_поверн_значення operator знак_операції(специф_параметрів)
{оператори_тіла_функції}
Перевантаження унарних операцій
Будь-яка унарна операція може бути визначена двома способами: або як компонентна функція без параметрів, або як глобальна функція з одним параметром. У першому випадку вираз Z означає виклик Z.operator (), у другому- виклик operator (Z).
Унарні операції, що перевантажуються в рамках визначеного класу, можуть перевантажуватися тільки через нестатичну компонентну функцію без параметрів. Викликаний об'єкт класу автоматично сприймається як операнд.
Унарні операції, що перевантажуються поза областю класу( як глобальні функції), повинні мати один параметр типу класу. Переданий через цей параметр об'єкт сприймається як операнд.
Синтаксис:
а) у першому випадку (опис в області класу):
тип_поверн_значення operator знак_операції
б) у другому випадку (опис поза областю класу):
тип_поверн_значення operator знак_операції(ідентифікатор_типу)
Приклади.
-
1)class person
2)class person
{ int age;
{ int age;
...
...
public:
public:
…
...
void operator++(){ ++age;}
friend void operator++(person&);
};
};
void main()
void person::operator++(person& ob)
{class person jon;
{++ob.age;}
++jon;}
void main()
{class person jon;
++jon;}
Перевантаження бінарних операцій
Будь-яка бінарна операція може бути визначена двома способами: або як компонентна функція з одним параметром, або як глобальна (можливо дружня) функція з двома параметрами. У першому випадку xy означає виклик x.operator(y), у другому – виклик operator(x,y).
Операції, що перевантажуються всередині класу, можуть перевантажуватися тільки нестатичними компонентними функціями з параметрами. Викликуваний об'єкт класу автоматично сприймається в якості першого операнда.
Операції, що перевантажуються поза областю класу, повинні мати два операнди, один із яких повинний мати тип класу.
Приклади.
1)class person{...};
class adresbook
{
// містить у якості компонентних даних множину об'єктів типу
//person, що представляються як динамічний масив, чи список дерево
…
public:
person& operator[](int); //доступ до i-ому об'єкта
};
person& adresbook : : operator[](int i){. . .}
void main()
{class adresbook persons;
class person record;
…
record = persons[3];
}
2) class person{...};
class adresbook
{ // містить у якості компонентних даних множину об'єктів типу //person, що представляються як динамічний масив, чи список дерево
…
public:
friend person& operator[](const adresbook&,int); //доступ до i-ого об'єкта
};
person& operator[](const adresbook& ob ,int i){. . .}
void main()
{class adresbook persons;
class person record;
…
record = persons[3];
}
Перевантаження операції присвоювання
Операція відрізняється трьома особливостями:
операція не успадковується;
операція визначена за замовчуванням для кожного класу як операцію порозрядного копіювання об'єкта, що стоїть праворуч від знака операції, в об'єкт, що стоїть ліворуч.
операція може перевантажуватися тільки в області визначення класу. Це гарантує, що першим операндом завжди буде ліводопустимий вираз.
Формат перевантаженої операції присвоювання:
ім'я_класу& operator=( ім'я_класу&);
Відзначимо дві важливі особливості функції operanor=. По-перше, в ній використовується посилання-параметр-посилання. Це необхідно для запобігання створення копії об'єкта, переданого через параметр за значенням. У випадки створення копії, вона видаляється викликом деструктора при завершенні роботи функції. Але деструктор звільняє розподілену пам'ять, ще необхідну об'єкту, що є аргументом. Посилання-параметр-посилання допомагає вирішити цю проблему.
По-друге, функція operator=() повертає не об'єкт, а посилання на нього. Зміст цього той же, що і при використанні посилання-параметр-посилання. Функція повертає тимчасовий об'єкт, що видаляється після завершення її роботи. Це означає, що для тимчасової змінної буде викликаний деструктор, що звільняє розподілену пам'ять. Але вона необхідна для присвоювання значення об'єкту. Тому, щоб уникнути створення тимчасового об'єкта, як такого, що повертає значення, використовується посилання.
Традиційно інтерфейс і реалізацію класу розміщують у різних файлах, як це
було з оголошеннями і визначеннями об'єктів. Інтерфейс записують у заголовні
файли. Ось приклад заголовного файлу для класу точок
//Point.h
#ifndef POINT_H
#define POINT_H
class Point
{
// Атрибути
private:
double _x;
double _y;
// Методи
public:
Point (double a=0, double b=0);
Point operator+(Point);
bool operator==(Point);
double modulus ();
double phi ();
}
#endif
Ось файл реалізації
//Point.cpp
#include ”Point.h”
#include <cmath>
Point :: Point(double a, double b)
{
_x=a; _y=b;
}
Point Point::operator+(Point v)
{
Point w;
w._x = _x + v._x;
w._y = _y + v._y;
return w;
}
bool operator== (Point v)
{
return (_x == v._x) && (_y == v._y);
}
double modulus ()
{
return sgrt(_x*_x+_y*_y);
}
double Point::phi ()
{
return atan(_y/_x);
}
//Кінець Point.cpp
Варіанти завдань для виконання роботи.
Постановка задачі: Розширити функціональність класу, реалізовану в попередній роботі, згідно тогож варіанту.
В клас Point додати:
Перевантаження:
операції ++ (--): одночасно збільшує (зменшує) значення полів х і у на 1;
констант true і false: звернення до екземпляра класу дає значення true, якщо значення полів x і у співпадає, інакше false;
операції бінарний +: одночасно додає до полів х і у значення скаляра;
перетворення типу Point в string (і навпаки).
В клас Triangle додати:
Перевантаження:
операції ++ (--): одночасно збільшує (зменшує) значення полів а, b і з на 1;
констант true і false: звернення до екземпляра класу дає значення true, якщо трикутник із заданими довжинами сторін існує, інакше false;
операції *: одночасно домножает поля а, b і c на скаляр;
перетворення типу Triangle в string (і навпаки).
В клас Rectangle додати:
Перевантаження:
операції ++ (--): одночасно збільшує (зменшує) значення полів а і b;
констант true і false: звернення до екземпляра класу дає значення true, якщо прямокутник із заданими довжинами сторін є квадратом, інакше false;
операції *: одночасно домножает поля а і b на скаляр;
перетворення типу Rectangle в string (і навпаки).
В клас Money додати:
Перевантаження:
операції ++ (--): одночасно збільшує (зменшує) значення полів first і second;
операції !: повертає значення true, якщо поле second не нульове, інакше false;
операції бінарний +: додає до значення поля second значення скаляра;
перетворення типу Money в string (і навпаки).
Додати в клас для роботи з одновимірним масивом цілих чисел:
Перевантаження:
операції ++ (--): одночасно збільшує (зменшує) значення всіх елементів масиву на 1;
операції !: повертає значення true, якщо елементи масиву не впорядковані за збільшенням, інакше false;
операції бінарний *: домножить всі елементи масиву на скаляр;
перетворення класу масив в тип string (і навпаки).
Додати в клас для роботи з двовимірним масивом цілих чисел:
Перевантаження:
операції ++ (--): одночасно збільшує (зменшує) значення всіх елементів масиву на 1;
констант true і false: звернення до екземпляра класу дає значення true, якщо двовимірний масив є квадратним;
операції бінарний +: дозволяючої скласти два масививдповідного розміру і типу;
перетворення класу масив в тип string (і навпаки).
Додати в клас для роботи з двовимірним масивом дійсних чисел:
Перевантаження:
операції ++ (--): одночасно збільшує (зменшує) значення всіх елементів масиву на 1;
констант true і false: звернення до екземпляра класу дає значення true, якщо кожний рядок масиву упорядоченна за збільшенням, інакше false.
операції *: дозволяючої помножити два масиви відповідних размерностей.
перетворення класу масив в східчастий масив (і навпаки).
Додати в клас для роботи з рядками:
Перевантаження:
операції унарного + (-): перетворюючої рядок до рядкових (прописним) символів;
констант true і false: звернення до екземпляра класу дає значення true, якщо рядок не порожній, інакше false.
операції &: повертає значення true, якщо рядкові поля двох об'єктів посимвольний рівні (без урахування регістра), інакше false;
перетворення класса-строка в тип string (і навпаки).
Додати в клас для роботи :
Перевантаження:
констант true і false: звернення до екземпляра класу дає значення true, якщо поле R додатне, інакше false;
операції бінарного +: , яка збільшує значення поля R на 2;.
перетворення класу Circle в тип string (і навпаки).
Додати в клас для роботи з датою:
Перевантаження:
операції !: повертає значення true, якщо встановлена дата не є останнім днем місяця, інакше false;
констант true і false: звернення до екземпляра класу дає значення true, якщо встановлена дата є початком року, інакше false;
операції &: повертає значення true, якщо поля двох об'єктів рівні, інакше false;
перетворення класу DataTime в тип string (і навпаки).
