Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТОД ЛАБ ООР++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
404.99 Кб
Скачать

Міністерство освіти і науки України Національний університет “Львівська політехніка”

Інститут підприємництва та перспективних технологій

Методичні вказівки до лабораторних робіт

з дисципліни “Об'єктно-орієнтоване програмування”

для студентів денної форми навчання освітньо-кваліфікаційного рівня „молодший спеціаліст”

спеціальності 5.05010101 Обслуговування програмних систем і комплексів

Затверджено

на засіданні циклової комісії

Протокол №1 від 29.09.14р.

Затверджено

на засіданні кафедри інформаційних систем і технологій

Протокол №1 від 29.09.14р.

Львів - 2014

Рекомендовано до друку Науково-методичною радою Навчально-наукового інституту підприємництва та перспективних технологій Національного університету “Львівська політехніка”.

Об’єктно-орієнтоване програмування: Методичні вказівки до виконання лабораторних робіт для студентів освітньо-кваліфікаційного рівня «молодший спеціаліст» спеціальності 5.05010105 - «Обслуговування програмних систем та комплексів»/ Укл. Д.Д.Пелешко, А.М.Ковальчук, О.В.Оборська - Львів: Навчально-наукового інституту підприємництва та перспективних технологій Національного університету “Львівська політехніка”, 2014. – 47 с.

Укладачі:

Пелешко Д.Д., д.т.н., проф.,

Ковальчук А.М., к.т.н., ст. викл.,

Оборська О.В., асист.

Відповідальний за випуск Матвійчук Я.М., д.т.н., проф., завідувач кафедри інформаційних систем і технологій

Рецензенти Литвин В.В., д.т.н., доц.,

Малець І.О., к.т.н., доц.

ЗМІСТ

Лабораторна робота №1

СТРУКТУРА КЛАСУ ТА МЕХАНIЗМИ ДОСТУПУ ДО ЙОГО КОМПОНЕНТIВ………………4

Лабораторна робота №2

ПЕРЕВАНТАЖЕННЯ МЕТОДIВ КЛАСУ I ОПЕРАЦIЙ.………..……….....………………...........13

Лабораторна робота №3

ПОХIДНI КЛАСИ ………..………..…..............................................................................21

Лабораторна робота №4

ПОХІДНІ КЛАСИ. ОБ'ЄКТНО-ОРІЄНТОВАНИЙ ЗВ'ЯЗАНИЙ СПИСОК В С++………………28

Лабораторна робота №5

РОЗРОБКА ШАБЛОНІВ КЛАСІВ І ФУНКЦІЙ………………………………………….…38

Список використаної літератури…………………………...………....46

Лабораторна робота № 1 Структура класу та механiзми доступу до його компонентiв

Мета: Вивчення базових елементiв ООП (поняття класу, протоколу, конструктора і т.д.) та їх застосування для розв'язку прикладних задач.

Основні теоретичні відомості

Типи даних і класи

У мові С++ визначено префіксну форму оголошення змінних. Якщо в С++-програмi написано "int nCount", то вважається, що int є тип, який визначає можину можливих значень змiнної nCount. Але поняття типу не зводиться тiльки до такого розумiння.

Тип T варто розумiти як пару  T = <At, Op>, де At визначає множи­ну можливих значень типу, а Op задає множину операцiй над значеннями даного типу.

Поряд з наперед визначеним набором вбудованих типів, С++ допускає створення власних типів даних. Найпростіше це можна здійснити через оголошення класу:

class iм'я_класу {

Члени даних; // Розділ атрибутів

Функції-члени - або методи; // Розділ операцій;

};

Якщо визначений клас (тип), наприклад з iменем A, можна говорити про змінні  цього класу (змiннi типу A), якi в ОПП називаються екземплярами або об'єктами  класу.

Роздiл атрибутiв призначений для оголошення  змiнних класу, які називаються членами даних. Їх ти­пи в сукупностi задають множину можливих значень, або ста­нiв об'єктiв класу.

Роздiл операцiй призначений для оголошення і визначення дій, якi можна виконувати над об'єк­тами класу або, за термінологією ООП, таких, що виконуються самими об'єктами. Такі операцiї ще називаються функціями членами або ме­то­дами класу. В сукупності вони описують поведінку об'єктiв класу.

Класи та iнкапсуляцiя

За означенням клас об'єднує "пiд одним дахом" данi  і операцiї. Вже таке розмiщення даних і операцiй в однiй "капсулi" можна розглядати як деяку iнкапсуляцiю. Однак пiд цим термiном розумiють прихованi реалiзацiї операцiй і даних класу вiд зовнiшнiх, у вiдношеннi до нього, про­грам, якi використовують клас.

Для реалiзації iнкапсуляцiї визначення класу розбивають на двi частини: iнтерфейс класу і реалiзацiю класу.

Iнтерфейс класу (або  протокол класу ) мiстить тiльки  оголошення його елементiв: змiнних і методiв. Виз­на­чення методiв у виглядi їх реа­лi­зацiї як функцiй мови С вiдокремленi вiд iнтерфейсу і розмiщуються в  реа­лi­зацiї класу (тобто за межами класу). Такий пiдхiд дозволяє при відомому лише інтерфейсі повноцінно викорис­товувати клас, оскільки з iнтерфейсу є зрозумілим, якi в класi операцiї і як їх викликати.

Реалiзацiя методів може бути довiльною, аби лише вона вiд­по­вiдала семантицi мови. Змiна реалiзацiї при збе­­реженнi iнтерфейсу і семантики не впливає на програми, якi використовують даний клас.

В С++ iнтерфейс класу оголошується в файлi заголовків (ФЗ) з роз­ширенням .hpp (.h), а реалiзацiя класу - в файлi з розширенням .cpp (.c). ФЗ мiстить оголошення змiнних класу і заголовки (прототипи) функ­цiй, якi реалiзовують операції класу.

Кожен член класу має додатковий статус, який задається оголо­шен­ням його в одній з трьох допустимих мовою секцій. Ці секції визначаються специфікаторами public, protected, private і задають права доступу до членів класу. Кожна секція починається з моменту оголошення її одним з вказаних специфікаторів і закінчується оголошенням нової секції або кінцем класу. Порядок слідування секцій, їх розмір та загальна кількість можуть бути довільними. Якщо секція явно не оголошується, то вона по замовчуванню приймається як секція private.

Секція private (або приватна) визначає право доступу до членів, оголошених в ній, лише для самого класу (тобто лише для функції-членів класу). Члени оголошені в цій секції називаються приватними або закри­тими. Секція protected (або захищена) визначає право доступу до членів як для самого класу так і для похідних від нього. Члени цієї секції нази­ваться захище­ними. Секція public (або відкрита) ще більше розширює права, які на­даються секцією protected, додатковим введенням мож­ливостей досту­пу до своїх членів для об'єктів даного класу. Члени цієї секції називаться відкритими або загальнодоступними.

Наведемо приклад

class A{ // по замовчуванні приватна секція

int i1; // закритий по замовчуванні член даних

public: // оголошення відкритої секції

int i2; // відкритий член даних

private: // оголошення ще однієї приватної секції

int i3; // ще один закритий член даних

protected: // оголошення приватної секції

int i4; // захищений член даних

public: // оголошення ще однієї відкритої секції

int i5; // ще один відкритий член даних

};

Конструктори і деструктори

Конструктори і деструктори - це спецiальнi методи класу, якi автоматично викликаються при створеннi або знищеннi об'єктiв.

Кожний клас повинен мати хоч би один конструктор, але, як правило, їх задають декiлька. Цільове призначення конструкторів класу є двояким. З одного боку (основного) - це створення "порожнього" об'єкта, тобто розподiл пам'ятi для змiнних класу цього об'єкта. З іншого - це додаткова iнiцiалiзацiя стану об'єкта, тобто заповненя "порожнього" об'єкта, оскільки саме в конструкторi визначається, якими значеннями потрiбно проiнiцiалiзувати змiннi об'єкта.

Синтаксично конструктор є функцією, іменем якої є iм'я кла­су, а тіло може бути довільної довжини і складності. 

Конструктори існують трьох типів: по замовчуванні, з параметрами і конструктор копіювання (або конструктор копії). Кожен клас може містити лише лише один конструктор по замовчуванні, один копіювання і довільну кількість конструкторів з параметрами. Це визначає можливість перевантаження конструкторів як звичайних функцій.

Конструктор по замов­чуванню  не має параметрiв, або всi його параметри приймають значення по замов­чуванню. Вiн викликається завжди без параметрiв. Якщо у виз­на­ченнi класу конструктор не ого­ло­ше­ний, то компіляторавтоматично створить конструктор по замовчуванню з порожнім тiлом, який виконує основне призначення без iнiцiалiзацiї для ло­кальних об’єктів і з нульовою для глобальних. Наприклад, в резуль­татi обробки компiлятором оголошення об'єкта

Patient Petrov;

викликається конструктор по замовчуванню Patient(), який або виз­начений в класi Patient, або створений компiлятором.

Iснують ще два спецiальних типи: конструктор копiювання і конструктор з параметрами. Перший має лише один параметр - константу або посилання на об'єкт даного класу, і дозволяє створювати об'єкти, як копії існуючих (в наведеному нижче прикладі спеціально приводиться син­таксис створення об'єкта через конструктор копіювання).

Інший конструктор може мати довільну кількість параметрів будь-яких типів. Стан новостворюваного об'єкта ініціалізується аргументами, які передаються через параметри даного конструктора.

Приведемо приклади оголо­шення конструкторів всiх типiв для деяко­го класу Patient:

class Patient {

char* m_s_Name; // закриті по замовчуванні

int m_n_Age; // члени даних

public:

// Конструктор по замовчуванню

Patient();

// Конструктори з параметрами для iнiцiалiзацiї

Patient(char* name, int Age);

Patient(char* name);

// Конструктор копiї

Patient(const Patient &source);

// iншi оголошення - можливi

};

Тепер можна написати реалізацію цих конструкторiв:

// Конструктор по замовчуванню

Patient::Patient() {

m_s_Name = "";

m_n_Age = 0;

}

// Конструктори з параметрами

Patient::Patient(char* name, int Age) {

m_s_Name = name;

m_n_Age = Age;

}

// Конструктор перетворення типу

Patient::Patient(char* name) {

m_s_Name = name;

}

// Констуктор копiї

Patient::Patient(const Patient &source) {

m_s_Name = source.m_s_Name;

m_n_Age = source.m_n_Age;

}

Тепер стають можливими оголошення об'єктiв, якi приводять до ви­клику вiдповiдних конструкторiв:

// Виклик конструктора по замовчуванню

Patient NN;

// Виклики конструкторів з iнiцiалiзацiєю

Patient Ivanov ("Ivanov",35), Petrov ("Petrov");

// Виклик конструктора копiї

Patient theSameIvanov ("Ivanov")=Ivanov;

Деструктор - це метод явного, або неявного знищення об'єкта. Наприклад, при виходi з блоку всi локальнi об'єкти знищуються і для цього автоматично викликається деструктор. Звiльняючи пам'ять, яка зайнята об'єктом, деструктор знищує всi результати роботи конструктора. Тiло деструктора, як правило - порожнє, оскiльки система сама звiльняє пам'ять. Але якщо конструктор явно виділяє динамічну пам'ять для членів об'єкта, то в тiлi деструктора має бути оператор, який звiльняє цю пам'ять перед знищенням самого об'єкта.

На відміну від конструкторів, клас може містити лише один деструктор і обов'язково параметрів. Iм'я десктруктора - це iм'я вiдпо­вiдного класу з префiксом "~". Наприклад, ~Patient() - деструктор класу Patient.

Хоча синтаксично конструктори і деструктори є функціями, проте вони не можуть повертати значень ос­кіль­ки їх цільовим призначенням є створення та знищення об'єктів класу.