МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
Кафедра САПР
ЗВІТ
до лабораторноі работи № 2
Реалізація абстракцій в мові програмування С++.
з курсу " Методи та засоби об’єктно-орієнтованого проектування "
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 - перегрузка операторів
Індивідуальне завдання:
Скласти програму на С++, яка представляє стандартний тип як об’єкт і дозволяє порівнювати дані між собою, проводити операції, що допускаються над double і вивести на екран ці дані.
Текст програми:
#include "stdafx.h"
#include "iostream"
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
class MyDouble
{
private:
double value;
public:
MyDouble():value(0){}
MyDouble(double v){value = v;}
~MyDouble(){}
double getValue(){return value;}
void setValue(double v){value = v;}
//operators
//operator "=="
friend double operator == (const MyDouble& v1, const MyDouble& v2)
{ return (v1.value == v2.value); }
//operator "!="
friend double operator != (const MyDouble& v1, const MyDouble& v2)
{ return (v1.value != v2.value); }
//operator ">"
friend double operator > (const MyDouble& v1, const MyDouble& v2)
{ return (v1.value>v2.value); }
//operator "<"
friend double operator < (const MyDouble& v1, const MyDouble& v2)
{ return (v1.value<v2.value); }
//operator "+"
friend MyDouble operator + (const MyDouble& v1, const MyDouble& v2)
{ return MyDouble(v1.value+v2.value); }
//operator "-"
friend MyDouble operator - (const MyDouble& v1, const MyDouble& v2)
{ return MyDouble(v1.value - v2.value); }
//operator "*"
friend MyDouble operator * (const MyDouble& v1, const MyDouble& v2)
{ return MyDouble(v1.value * v2.value); }
//operator "/"
friend float operator / (const MyDouble& v1, const MyDouble& v2)
{
if(v2.value == 0) {cout<<"Division by zero!Stop"<<endl; return 0; }
return v1.value/(float)v2.value;;
}
//operator "<<"
friend ostream& operator << (ostream& stream, const MyDouble& v1)
{
stream<<(double)v1.value;
return stream;
}
//operator ">>"
friend istream& operator >> (istream& stream, const MyDouble& v1)
{
stream>>(double)v1.value;
return stream;
}
};
void main(void)
{
MyDouble d1;
MyDouble d2(10.5);
cout<<"MyDouble#1 = "<<d1<<endl
<<"MyDouble#2 = "<<d2<<endl
<<"MyDouble#1 < MyDouble#2: "<<((d1<d2)?"true":"false")<<endl
<<"MyDouble#1 > MyDouble#2: "<<((d1>d2)?"true":"false")<<endl
<<"MyDouble#1 == MyDouble#2: "<<((d1==d2)?"true":"false")<<endl
<<"MyDouble#1 != MyDouble#2: "<<((d1!=d2)?"true":"false")<<endl
<<"MyDouble#1 < -5: "<<((d1<-5)?"true":"false")<<endl
<<"Enter MyDouble#1 and MyDouble#2 [I#1 I#2]: ";
cin>>d1>>d2;
cout<<"\nMyDouble#1 = "<<d1<<endl
<<"MyDouble#2 = "<<d2<<endl
<<"MyDouble#1 + MyDouble#2 = "<<d1+d2<<endl
<<"MyDouble#1 - MyDouble#2 = "<<d1-d2<<endl
<<"MyDouble#1 * MyDouble#2 = "<<d1*d2<<endl
<<"MyDouble#1 / MyDouble#2 = "<<d1/d2<<endl;
getch();
}
Результат роботи програми:
Висновок:
На даній лабораторній роботі я навчився працювати з перегрузками операцій та створив клас який представляє стандартний тип double, як обєкт.