Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_LAB_Part_2_Obyektno-orientov_progr.DOC
Скачиваний:
11
Добавлен:
03.05.2019
Размер:
418.3 Кб
Скачать

Лабораторна робота №5. Перевантаження операцій.

Мета. Одержати практичні навички роботи в середовищі BC++5.02 і створення EasyWin програми. Одержати практичні навички створення абстрактних типів даних і перевантаження операцій у мові С++.

Основний зміст роботи.

Визначити і реалізувати клас — абстрактний тип даних. Визначити і реалізувати операції над даними цього класу. Написати і виконати 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=() повертає не об'єкт, а посилання на нього. Зміст цього той же, що і при використанні посилання-параметр-посилання. Функція повертає тимчасовий об'єкт, що видаляється після завершення її роботи. Це означає, що для тимчасової змінної буде викликаний деструктор, що звільняє розподілену пам'ять. Але вона необхідна для присвоювання значення об'єкту. Тому, щоб уникнути створення тимчасового об'єкта, як такого, що повертає значення, використовується посилання.

3.Створення додатків у Borland C++ 5.02.

  • Проекти і вузли.

Проект- це файл, що містить усе необхідне для побудови кінцевого продукту: встановлені параметри, інформацію про цільове середовище і про вхідні файли. Файл проекту має розширення ide.

Термін “вузол” застосовується для позначення різних об'єктів, що знаходяться у вікні проекту. Кожен вузол може залежати від одного чи більшої кількості вузлів. Це означає, що до обробки такого вузла, ті вузли, від яких він залежить, повинні бути успішно оброблені. Самий верхній вузол в ієрархії вузлів називається метою. Можна внести більше, ніж одну цільову програму в файл .ide. Рекомендується зберігати в одному проекті файли, зв'язані за змістом.

  • .Програма з одного модуля.

1.Якщо вихідний файл існує, відкрийте його, вибравши меню File|Open. У противному випадку- меню File|New, команда Text Edit. Введіть вихідний код у нове вікно редактора і збережіть у файлі, вибравши меню File|Save.

2.Активізуйте локальне меню редактора, натиснувши праву кнопку миші в середині вікна( чи Alt+F10) і виберіть опцію Target Expert. З'явиться вікно діалогу Target Expert.

3.Виберіть для вашої програми придатні параметри і натисніть Ok. Наприклад, можна побудувати програму як стандартний додаток DOC, як додаток EasyWin для Windows 3.x(16-ти розрядне) чи типу Console для Win32. Рекомендується будувати EasyWin програму.

4.У меню Debug(Налагодження) виберіть Sun (Виконати). Програма буде відкомпільована, відредагована і виконана.

5.Для прискорення повторної компіляція у випадку виявлення і виправлення помилок рекомендується встановити режим прекомпіляції і збереження відкомпільованого коду заголовних файлів. Для цього в меню Options|Project|Compiler виберіть опцію Precompiled Headers і встановіть прапорець Generate and use.

  • .Проекти і багатомодульні програми.

Якщо для створення програми використовується кілька вихідних модулів, ви повинні організувати проект.

Для організації проекту:

1.У меню File|New виберіть Project. З'явиться вікно New Target. Це розширений варіант вікна Target Expert.

2.У вікні вкажіть ім'я проекту (Project Path and Name), ім'я і тип вхідного модуля(Target Name) і необхідні специфікації бібліотек С++.

3.Виберіть кнопку Advanced, щоб уточнити проект. З'явиться вікно Advanced Options.

4.Якщо програма не застосовує керування ресурсами і не містить у собі файл.def, виключте селектори .rc і .def.

5.Закрийте вікна Advanced Options і New Target( кнопкою Ok).

6.У вікні, що з'явилося, Project за допомогою правої кнопки миші вкажіть вузол, щоб активізувати його локальне меню. Щоб включити у проект нові модулі, виберіть у меню опцію Add Node. З'явиться вікно Add to Proect List, що дозволить вам знайти і вказати ті файли, які потрібно включити в проект.

7.Після того, як ви підключили нові вузли, за допомогою правої кнопки миші вкажіть на цільовий вузол. Тепер щоб побудувати програму, виберіть опцію Make Node.

8.Після того як ви створили і зберегли проект, ви зможете надалі завантажувати його в IDE командою Open Project у меню Project. При цьому завантажуються всі зв'язані з ним файли.

  • .Побудова декількох цільових модулів.

1.У меню Project виберіть New Target. З'явиться вікно діалогу Add Target.

2.Введіть ім'я цільового модуля, встановіть тип мети(Standard) і натисніть Ok. З'явиться вікно New Target.

3.Встановіть у вікні New Target необхідні параметри.

4.Якщо необхідно знову створений цільовий вузол зробити підвузлом іншого вузла, то за допомогою лівої кнопки миші “перенесіть” вузол і “покладіть” його на вузол, підвузлом якого він буде.

5.Викличте правою кнопкою миші локальне меню цільового вузла і виберіть Build Node, щоб побудувати програму.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]