МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
І Н С Т Р У К Ц І Я
до лабораторноі работи № 2
Реалізація абстракцій в мові програмування С++.
з курсу "Методи та засоби об’єктно-орієнтованого проектування "
для студентів
спеціальності 7.080402 - "Інформаційні технології пректування"
ЗАТВЕРДЖЕНО:
на засіданні кафедри САПР
Протокол № 14 від 3.04.1997 р.
Львів -2001
1. МЕТА РОБОТИ
Мета роботи - Реалізація абстракцій в мові програмування С++.
2. ТЕОРЕТИЧНА ЧАСТИНА
1. Компоненти об’єктно-орієнтовааного проектування.Розрізняють чисто об’єктно-орієнтовані мови та змішані.До перших належать Smalltalk, Ada, Simula, до других С++, CLOS, Об’єктний Паскаль та інші. Введемо визначення п’яти ключових компонент об’єктно-орієнтованого проектування:- Об’єкт Об’єкт - це інкапсульована абстракція, яка включає інформацію про стан і чітко визначену множину протоколу доступу (повідомлення, які опрацьовує об’єкт).
- Повідомлення Повідомлення - це спеціальний символ, ідентифікатор або ключове слово з або без параметрів, яке представляє дію.
- Клас Представляє певний тип об’єктів і задається прои допомозі опису класу, який визначає змінні стану і протокол доступа до об’єктів даного класу. Класи організуються ієрархічно, причому підкласи наслідують властивості базових класів. В деяких об’ктно-орієнтованих мовах класи - це також і об’єкти.
- Екземпляр об’єкта Об’єкти належать до будь-якого класу. Властивості екземпляра об’єкта визначаються описом класу.
- Метод Метод існує для кожного повідомлення, визначеного для деякого класу. Метод визначає реакцію об’єкта на повідомлення. Як правило складається з ряду виразів і може використовувати протокол з іншого класу.
2. Опис абстракцій в мові С++.
Мова С++ використовує подібну термінологію
Клас Вводить новий тип даних
Об’єкт Змінна типу className
Дані стану Об’являються в опису класу і називаються членами
Повідомлення Повідомлення, які об’єкт може опрацювати, вказуються при допомозі прототипів функцій в описі класу. Прототипи функцій включають ім’я функції, список параметрів та тип, який повертає функція.
Метод Це визначення (реалізіція) функцій. Прототипи функцій і їх визначення разом представляють собою повідомлення, які об’єкт може опрацьовувати. В сукупності вони називаються функціями-членами. До членів класу відносяться функції-члени і поля даних.
Підклас Похідний клас. Його суперклас називається базовим класом.
Об’єкт містить в собі значення, які відображають його внутрішній стан. Крім того він містить дані про спосіб обробки повідомлень, які він отримує. В об’єкті інкапсульовані всі властивості абстракції, включаючи значення абстракцій даних (змінні стану) і функціональні абстракції (повідомлення і методи).
Для об’єктів бажані наступні властивості:
Чітка границя Ця границя визначає область бачення інкапсуляції. В С++ область бачення інкапсуляції для об’єкту поширюється на опис його класу, включаючи опис базових класів.
Інтерфейс описує те, як об’єкт взаємодіє з іншими об’єктами або сегментами програми. В С++ інтерфейс задається за допомогою прототипів функцій-членів. Як правило, інші об’єкти можуть здійснювати доступ до об’єкта тільки через такий контрольований інтерфейс.
Внутрішній вигляд об’єкта невидимий для інших об’єктів і не може бути змінений ними. В С++ цей захист є гнучким і може керуватися завдяки використанню концепції закритих, захищених і відкритих розділів опису класу. Для цієї ж цілі використовується принцип дружніх класів і функцій.
3. Перегрузка функцій та операцій.
Перегрузка функцій
Перегрузка функцій означає, що одне і теж ім’я функції може використовуватися для передачі повідомлень об’єктам різних класів, і що кожен об’єкт буде реагувати на повідомлення певним чином.
Функції С++, які не є частиною протоколу опису класу, можуть бути перегружені.
Функції в середині опису класу також можуть бути перегружені.
Для цих перегрузок діють такі правила: імена функцій можуть бути перегружені в межах однієї області бачення. Компілятор відрізняє одну функцію від іншої по її сигнатурі. Сигнатура функції задається числом, порядком та типами параметрів. Функції не можуть бути перегружені за типом значення, що повертається.
При перегрузці функцій в похідних класах (використання того ж імені функції, що і в базовому класі) списки параметрів функцій можуть співпадати. Детальний розгляд цього випадку виходить за межі Лаб.р.№2.
Перегрузка операцій.
С++ надає механізм перегрузки операцій шляхом визначення функцій з ключовим словом operator. Розрізняють бінарні та унарні операції. Бінарна операція (напр. +, -, = і т. д.) може бути визначена чи як функція-член, яка отримує один параметр, або як глобальна функція, яка отримує два параметра. Таким чином, для будь-якої бінарної операції = вираз а = b може інтерпритуватися як a.operator=(b) або як operator=(a,b). Унарне операція (напр. !, ++, -- і т. Д.), префіксна або постфіксна, може бути визначена як функція-член, що не отримує параметрів, або як глобальна функція, що отримує один параметр.
Функція-операція , яка має першим параметром основний тип, не може бути функцією-членом. Розглянемо, наприклад, додавання змінної цілого типу х з цілим 5: якщо правильно оголосити функцію-член +, то вираз х+5 може бути проінтерпритовано як х.operator(5), але з виразом 5+х це вже не може бути зроблене, оскільки це означало б
5.оperator(х), що невірно.
Розглянемо конкретний приклад.
#include<iostream.h>
#include<stdlib.h>
class Integer {
private:
int value;
public:
// Конструктори і деструктори
Integer() {}
Integer(int anlnt) { value = anlnt; }
~Integer() {}
//Mетоди доступа
int getValue() { return value; }
void setVlue(int aValue) { value = aValue; }
// Методи порівняння
friend int operator==(const Integer& anlnt1, const Integer& anlnt2)
{
return anlnt1.value == anlnt2.value;
}
friend int operator>(const Integer& anlnt1, const Integer& anlnt2)
{
return anlnt1.value > anlnt2.value;
}
friend int operator<(const Integer& anlnt1, const Integer& anlnt2)
{
return anlnt1.value < anlnt2.value;
}
//Арифметичні методи
friend Integer operator+(const Integer& anlnt1, const Integer& anlnt2)
{
return Integer(anlnt1.value + anlnt2.value);
}
friend Integer operator-(const Integer& anlnt1, const Integer& anlnt2)
{
return(anlnt1.value - anlnt2.value);
}
friend Integer operator*(const Integer& anlnt1, const Integer& anlnt2)
{
return(anlnt1.value * anlnt2.value);
}
friend Integer operator/(const Integer& anlnt1, const Integer& anlnt2)
{
if(anlnt2.value == 0) {
cout << “Divide by zero.Stop”;
exit(1);
}
return(anlnt1.value / anlnt2.value);
}
//Методи друку
friend ostream& operator<<(ostream& stream, const Integer& anlnt)
{
stream << anlnt.value;
return stream;
}
};
8, 9 - перегрузка функцій
15,19,23,28,32,36,40,49 - перегрузка операторів
3. КОНТРОЛЬНІ ЗАПИТАННЯ
Які існують компоненти ООП ?
Які ви знаєте абстакції в С++ ?
В чому різниця між компонентами ООП та С++ ?
Що таке перегрузка Які види перегрузок в С++ існують ?
В чому особливість перегрузки операторів для основних типів ?
Що значить ідентифікатор cons у списку параметрів функцій ?
Яку арифметична операція приведеної програми реалізована не зовсім коректно і чому ?
4. ЛАБОРАТОРНЕ ЗАВДАННЯ
Одержати індивідуальне завдання.
Скласти програму на С++, яка представляє стандартний тип як об’єкт і дозволяє порівнювати дані між собою, проводити операції, що допускаються над даним типом (згідно варіанту) і вивести на екран ці дані.
5. СПИСОК ЛІТЕРАТУРИ
Касаткин А.И., Вальвачев А.Н. Профессиональное програмирование
на языке Си: От Turbo к Borland C++:Справ. пособие; Под общ. ред. А.И.Касаткина. - Мн.:Выш.шк., 1992
Бьярн Страуструп Язык програмирование С++ Т.1,:Киев “ДиаСофт”, 1993
Herbert Schildt Using Turbo C++, Osborn McGraw-Hill,1990
Greg Voss, Paul Chui Turbo C++ DiskTutor, Second Edition, Osborn McGraw-Hill,1991
Ричард Вайнер, Льюис Пинсон С++ изнутри: Киев “ДиаСофт”, 1993