Professional Documents
Culture Documents
С
С
ЗМІСТ..................................................................................................................................................1
ПЕРЕДМОВА......................................................................................................................................2
Лабораторна робота № 1 КЛАСИ І ОБ'ЄКТИ В С ++.....................................................................3
Лабораторна робота № 2 УСПАДКУВАННЯ І ПОЛІМОРФІЗМ.................................................19
Лабораторна робота № 3 ВІДНОШЕННЯ МІЖ КЛАСАМИ. ІЄРАРХІЯ ОБ’ЄКТІВ.
ІТЕРАТОРИ........................................................................................................................................30
Лабораторна робота № 4 ПЕРЕВАНТАЖЕННЯ ОПЕРАЦІЙ.......................................................42
Лабораторна робота № 5 ШАБЛОНИ ФУНКЦІЙ І КЛАСІВ........................................................53
Лабораторна робота № 6 КЛАСИ ПОТОКІВ.................................................................................61
Лабораторна робота № 7 СТАНДАРТНА БІБЛІОТЕКА ШАБЛОНІВ........................................75
СПИСОК ЛІТЕРАТУРИ....................................................................................................................92
ПЕРЕДМОВА
В залежності від степені деталізації діаграми, опис поля може включати ім’я
поля, тип і значення, що присвоюється за замовчанням, а також ознаку
видимості:
< ознака видимості > < ім’я > : < тип > = < значення >
При описі методів вказують:
< ознака видимості > < ім’я > (< список параметрів >) : < тип результату >
Для полів та методів ознака видимості може приймати такі значення:
символ ‘+’ – загальнодоступний;
символ ‘#’ – захищений;
символ ‘– ‘ – приватний.
Приклад визначення класу.
const int LNAME=25;
class STUDENT{
char name[LNAME]; // ім'я
int age; // вік
float grade; // рейтинг
public:
STUDENT(); //конструктор без параметрів
STUDENT(char*,int,float);//конструктор з параметрами
STUDENT(const STUDENT&); // конструктор копіювання
~STUDENT(); // деструктор
char* GetName() ;
int GetAge() const;
float GetGrade() const;
void SetName(char*);
void SetAge(int);
void SetGrade(float);
void Set(char*,int,float);
void Show(); };
Професійніше визначення поля name типу покажчик: char* name. Проте в
цьому випадку реалізація методів ускладнюється.
2. Приклад реалізації конструктора з видачею повідомлення.
STUDENT::STUDENT(char*NAME,int AGE,float GRADE)
{
strcpy(name,NAME);
age=AGE;
grade=GRADE);
cout<<\nКонструктор з параметрами, викликаний для об'єкту
<<this<<endl;
}
3. Слід передбачити в програмі всі можливі способи виклику конструктора
копіювання. Нагадуємо, що конструктор копіювання викликається:
а) при використанні об'єкту для ініціалізації іншого об'єкту
STUDENT a(“Петренко”,19,50), b=a;
б) коли об'єкт передається методу по значенню
void View(STUDENT a){a.Show;}
в) при побудові тимчасового об'єкту як значення методу , що повертається
STUDENT NoName(STUDENT & student)
{
STUDENT temp(student);
temp.SetName(“NoName”);
return temp;
}
STUDENT c=NoName(a);
4. У програмі необхідно передбачити розміщення об'єктів як в статичній,
так і в динамічній пам'яті, а також створення масивів об'єктів.
а) масив студентів розміщується в статичній пам'яті
STUDENT gruppa[3];
gruppa[0].Set(“Иванов”,19,50);
або
STUDENT gruppa[3] = { STUDENT(“Иванов”,19,50),
STUDENT(“Петрова”,18,25.5),
STUDENT(“Сидоров”,18,45.5)
};
б) масив студентів розміщується в динамічній пам'яті
STUDENT *p;
p=new STUDENT [3];
p-> Set(“Иванов”,19,50);
5. Приклад використання вказівника на метод
void (STUDENT::*pf)();
pf=&STUDENT::Show;
(p[1].*pf)();
6. Програма використовує три файли:
• заголовний h-файл з визначенням класу
• cpp-файл з реалізацією класу
• сpp-файл демонстраційної програми.
Для запобігання багатократному включенню файлу-заголовка слід
використовувати директиви препроцесора
#ifndef STUDENT.H
#define STUDENT.H
// модуль STUDENT.H
...
#endif
Зміст звіту.
1. Титульний лист: назва дисципліни; номер і найменування роботи;
прізвище, ім'я, по батькові студента; дата виконання.
2. Постановка завдання. Слід дати конкретну постановку, тобто вказати,
який клас повинен бути реалізований, які повинні бути в нім конструктори,
компоненти-методу і т.д.
3. Визначення призначеного для користувача класу з коментарями.
4. Реалізація конструкторів і деструктора.
5. Фрагмент програми, що показує використання вказівника на об'єкт і
вказівника на метод з поясненням.
6. Лістинг основної програми, в якому повинно бути вказано, в якому
місці і який конструктор або деструктор викликаються.
Додаток
Таблиця 1
Варіанти завдань
№ Назва класу Поле Тип поля
1. СТУДЕНТ ім’я char*
курс int
стать int(bool)
2. ВИРІБ назва char*
шифр char*
кількість int
3. АДРЕСА ім’я char*
вулиця char*
номер будинку int
4. ЦЕХ назва char*
начальник char*
кількість працівників int
5. КРАЇНА назва char*
форма управління char*
площа float
6. СЛУЖБОВЕЦЬ ім’я char*
вік int
стаж роботи int
7. БІБЛІОТЕКА назва char*
автор char*
ціна float
8. ТОВАР назва char*
кількість int
ціна float
9. ПЕРСОНА ім’я char*
вік int
стать int(bool)
10. ТВАРИНА назва char*
вид char*
средня вага int
11. КАДРИ ім’я char*
номер цеху int
разряд int
12. ЭКЗАМЕН ім’я студента char*
дата int
оцінка int
13. КВИТАНЦІЯ номер int
дата int
сума float
14. АВТОМОБІЛЬ марка char*
потужність float
ціна float
15. КОРАБЕЛЬ назва char*
тонажність int
тип char*
16. СТУДЕНТ ім’я char*
курс int
стать int(bool)
17. ВИРІБ назва char*
шифр char*
кількість int
18. АДРЕСА назва char*
вулиця char*
номер будинку int
19. ЦЕХ назва char*
начальник char*
кількість працівників int
20. КРАЇНА назва char*
форма управління char*
площа float
21. СЛУЖБОВЕЦЬ ім’я char*
вік int
стаж роботи int
22. БІБЛІОТЕКА назва char*
автор char*
ціна float
23. ТОВАР назва char*
кількість int
ціна float
24. ПЕРСОНА ім’я char*
вік int
стать int(bool)
25. ТВАРИНА назва char*
вид char*
средня вага int
26. КАДРИ ім’я char*
номер цеху int
разряд int
27. ЭКЗАМЕН ім’я студента char*
дата int
оцінка int
28. КВИТАНЦІЯ номер int
дата int
сума float
29. АВТОМОБІЛЬ марка char*
потужність float
ціна float
30. КОРАБЕЛЬ назва char*
тонажність int
тип char*
Лабораторна робота № 2
УСПАДКУВАННЯ І ПОЛІМОРФІЗМ
{Int a, b;
public:
Basis (int x, int y) {a = x; b = y;}
};
class Inherit: public Basis
{int sum;
public:
Inherit (int x, int y, int s): Basis (x, y) {sum = s;}
};
Об'єкти класу конструюються знизу вгору: спочатку базовий, потім
компоненти-об'єкти (якщо вони є), а потім сам похідний клас. Таким чином,
об'єкт похідного класу містить як підоб'єкт об'єкт базового класу.
Знищуються об'єкти в зворотному порядку: спочатку похідний, потім його
компоненти-об'єкти, а потім базовий об'єкт.
Таким чином, порядок знищення об'єкта протилежний по відношенню до
порядку його конструювання.
Поліморфізм. Віртуальні методи. До механізму віртуальних методів
звертаються в тих випадках, коли в кожному похідному класі потрібно свій
варіант деякого методу. Класи, що включають такі методу, називаються
поліморфними і відіграють особливу роль у ООП.
Віртуальні методи надають механізм пізнього (відкладеного) або
динамічного зв'язування. Будь-який нестатичних метод базового класу може
бути віртуальним, для чого використовується ключове слово virtual.
Приклад.
Class base
{
public:
virtual void print () {cout << "\ nbase";}
...
};
де gr об'єкт-група.
Динамічна ідентифікація типів.
Динамічна ідентифікація типу характерна для мов, в яких підтримується
поліморфізм. У цих мовах можливі ситуації, в яких тип об'єкта на етапі
компіляції невідомий.
У С ++ поліморфізм підтримується через ієрархії класів, віртуальні методи
і вказівники базових класів. При цьому вказівник базового класу може
використовуватися або для вказівки на об'єкт базового класу, або для вказівки на
об'єкт будь-якого класу, похідного від цього базового.
Нехай група містить об'єкти різних класів і необхідно виконати деякі дії
тільки для об'єктів певного класу. Тоді в ітераторі ми повинні розпізнавати тип
чергового об'єкта.
У стандарт мови С++ включені засоби RTTI (Run – Time Type
Idendification) динамічна ідентифікація типів.
Інформацію про тип об'єкта отримують за допомогою оператора typeid,
визначення якого містить заголовний файл <typeinfo. h>.
Є дві форми оператора typeid:
typeid (об'єкт)
typeid (Назва_Типу)
Оператор typeid повертає посилання на об'єкт типу type_info. У класі
type_info перевантажені операції = = і ! =, що забезпечують порівняння типів.
Метод name() повертає вказівник на назву типу. Є одне обмеження.
Оператор typeid працює коректно тільки з об'єктами, у яких визначені віртуальні
методи . Більшість об'єктів мають віртуальні методи, хоча б тому, що зазвичай
деструктор є віртуальним для усунення потенційних проблем з похідними
класами. Коли оператор typeid застосовують до неполіморфному класу (в класі
немає віртуальної методу ), отримують вказівник або посилання базового типу.
Приклади.
1.
#include <iostream.h>
#include <typeinfo.h>
class Base {
virtual void f() {};
// ...
};
class Derived: public Base {
// ...
};
void main ()
{int i;
Base ob, * p;
Derived ob1;
cout << typeid(i) .name (); // Виводиться int
p = & ob1;
cout << typeid (*p).name(); // Виводиться Derived
}
2.
// початок див. вище
void WhatType (Base & ob)
{cout << typeid(ob).name() << endl;
}
void main ()
{
Base ob;
Derived ob1;
WhatType (ob); // Виводиться Base
WhatType (ob1); // Виводиться Derived
}
3.
// початок див. вище
void main ()
{
Base * p;
Derived ob;
p = & ob;
if (typeid (*p) == typeid (Derived)) cout << "p вказує на об'єкт типу
Derived ";
...
}
Якщо при зверненні typeid (*p), p = NULL, то збуджується виняткова
ситуація bad_typeid.
Порядок виконання роботи.
1. Доповнити ієрархію класів лабораторної роботи № 2 класами "Група".
Наприклад, для предметної області ФАКУЛЬТЕТ можна використати класи
"факультет", "студентська група", "кафедра". Рекомендується створити
абстрактний клас "підрозділ", який буде базовим для всіх груп і абстрактний
клас TObject, що знаходиться на чолі всієї ієрархії.
2. Написати для класу-групи метод-ітератор.
3. Написати процедуру або метод, яка виконується для всіх об'єктів, що
входять в групу (дивися приклади в додатку).
4. Написати демонстраційну програму, в якій створюються,
відображаються і знищуються об'єкти-групи, а також демонструється
використання ітератора.
Методичні вказівки.
1. Клас-група повинен відповідати ієрархії класів лабораторної роботи
№2, тобто об'єкти цих класів повинні входити в групу. Наприклад, для
варіанта 1 може бути запропонована наступна ієрархія класів:
Зав. кафедрою
Викладачі Викладачі
Студенти Студенти
Завкафедрою Завкафедрою
void main () {
class person jon;
++ jon;
}
Перевантаження бінарних операцій. Будь-яка бінарна операція
може бути визначена двома способами: або як компонентний метод з одним
параметром, або як глобальна (можливо дружня) функція з двома
параметрами. У першому випадку xy означає виклик x.operator (y), у
другому – виклик operator (x, y).
Операції, що перевантажуються всередині класу, можуть
перевантажуватися тільки нестатичними компонентними методами з
параметрами. Об'єкт класу автоматично сприймається в якості першого
операнду.
Операції, що перевантажуються поза областю класу, повинні мати два
операнди, один з яких повинен мати тип класу.
Приклади.
1). class person {...};
class adresbook {
// Містить як компонентні дані множину об'єктів типу
// person, що представляються як динамічний масив, список або дерево
person *M;
public:
person & operator [] (int); // доступ до i-го об'єкту
};
person & adresbook::operator [] (int i) {
return M[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];
}
об'єктів-рядків.
кожен потоковий клас підтримує буферний об'єкт, який надає пам'ять
для переданих даних, а також найважливіші функції введення/виведення
низького рівня для їх обробки.
базовим шаблоном класів basic_ios (для потокових класів) і
basic_streambuf (для буферних класів) передаються по два параметра
шаблону:
o перший параметр (charT) визначає символьний тип;
enum io_state {
goodbit, // немає помилки 0х00
eofbit, // кінець файлу 0х01
failbit, // остання операція не виконалася 0Х02
badbit, // спроба використання неприпустимої операції 0Х04
hardfail // фатальна помилка0Х08
};
Прапори, що визначають результат останньої операції з об'єктом ios,
містяться в змінній state. Отримати значення цієї змінної можна за
допомогою функції int rdstate ().
Крім того, перевірка стану потоку здійснюється за допомогою таких
функцій:
int bad (); 1, якщо badbit або hardfail
int eof (); 1, якщо eofbit
int fail (); 1, якщо failbit, badbit або hard fail
int good (); 1, якщо goodbit
Огляд алгоритмів.
Типи даних в STL:
value_type тип елемента
allocator_type тип розподільника пам'яті
size_type тип індексів, лічильника елементів і т.д.
iterator поводиться як value_type *
reverse_iterator переглядає контейнер в зворотному порядку
reference поводиться як value_type &
key_type тип ключа (для асоціативних контейнерів)
key_compare тип критерію порівняння (для асоціативних
контейнерів)
mapped_type тип відображеного значення
Ітератори:
СПИСОК ЛІТЕРАТУРИ
Основна
1. Буч Г. Об'єктно-орієнтований аналіз та проектування з прикладами
Додаткова
1. Аммераль Л. STL для програмістів на С++. М., ДМК, 1999
2. Паппас К., Мюррей У. Visual C++ 6: Керівництво розробника. Київ:
BHV, 2000.
3. Шілдт Г. Полный справочник по C++, 4-е издание (C++: The
Complete Reference, 4th Edition.) — М.: «Вильямс», 2011. — 800 с..
4. Стивен Прата. Язык программирования C++ (C++11). Лекции и
упражнения. – 2012. – 1248 с.