- •Лабораторна робота № 1
- •Короткі теоретичні відомості
- •Лабораторна робота № 2 Побудова|шикування| рекурсивних функцій
- •Короткі теоретичні відомості
- •Лабораторна робота № 3 Створення|створіння| і обробка масивів
- •Короткі теоретичні відомості
- •Лабораторна робота № 4 Робота з рядками|
- •Лабораторна робота № 5 Робота з|із| абстрактними типами даних(атд|): struct, union, enum
- •Короткі теоретичні відомості
- •Лабораторна робота № 6
- •Короткі теоретичні відомості Клас.
- •Приклади|зразки|.
- •Приклад|зразок|.
- •Список літератури Основна
- •Допоміжна
- •Деякі функції роботи з рядками із файлу string.H
- •39614, М. Кременчук, вул. Першотравнева, 20
Приклад|зразок|.
сomplex(double re1 = 0.0,double im1 = 0.0){re = re1; im = im1;}
Конструктор виділяє пам'ять для об'єкту і ініціалізує дані члени класу.
Конструктор має ряд|лаву,низку| особливостей:
Для конструктора не визначається тип значення, що повертається. Навіть тип void не припустимий.
Покажчик на конструктор не може бути визначений, і відповідно не можна одержати|отримати| адресу конструктора.
Конструктори не успадковуються|наслідують|.
Конструктори не можуть бути описані з|із| ключовими|джерельними| словами virtual, static, const, mutuable, valatile.
Конструктор завжди існує для будь-якого класу, причому, якщо він не визначений явно, він створюється автоматично. За умовчанням створюється конструктор без параметрів і конструктор копіювання. Якщо конструктор описаний явно, то конструктор за умовчанням не створюється. За умовчанням конструктори створюються загальнодоступними (public).
Параметром конструктора не може бути його власний клас, але|та| може бути посилання|заслання| на нього (T&). Без явної вказівки програміста конструктор завжди автоматично викликається|спричиняється| при визначенні (створенні|створінні|) об'єкту. В цьому випадку викликається|спричиняється| конструктор без параметрів. Для явного виклику конструктора використовуються дві форми:
ім'я _класу ім'я _об’єкту (фактичні_параметри);
ім'я _класу (фактичні_параметри);
Перша форма допускається тільки|лише| при не порожньому|пустому| списку фактичних параметрів. Вона передбачає виклик конструктора при визначенні нового об'єкту даного класу:
complex ss (5.9,0.15);
Друга форма виклику приводить|призводить,наводить| до створення|створіння| об'єкту без імені:
complex ss = complex (5.9,0.15);
Існують два способи ініціалізації даних об'єкту за допомогою конструктора. Раніше ми розглядали|розглядували| перший спосіб, а саме передачу значень параметрів в тіло конструктора. Другий спосіб передбачає застосування|вживання| списку ініціалізаторів даного класу. Цей список розміщується| між списком параметрів і тілом конструктора. Кожен ініціалізатор| списку відноситься до конкретного компоненту і має вигляд|вид|:
ім’я_даного (вираз|вираження|)
Приклади|зразки|.
class CLASS_A
{
int i; float e; char з|із|;
public:
CLASS_A(int ii,float ее,char cc) : i(8),e( i * її + ii ),с(сс|){
. . .
};
Клас “символьний рядок”.
#include <string.h>
#include <iostream.h>
class string
{
char *ch; // покажчик на текстовий рядок
int len; // довжина текстового рядка
public:
// конструктори
// створює об'єкт – порожній|пустий| рядок
string(int N = 80): len(0){ch = new char[N+1]; ch[0]= ‘0’;}
// створює об'єкт по заданому рядку
string(const char *arch){len = strlen(arch);
ch = new char[len+1];
strcpy(ch,arch);}
// компоненти-функції
// повертає посилання|заслання| на довжину рядка
int& len_str(void){return len;}
// повертає покажчик на рядок
char *str(void){return ch;}
. . .};
Тут в|в,біля| класі string два конструктори – перенавантажувані|перевантажувані| функції.
За умовчанням створюється також конструктор копіювання вигляду|виду|
T::T(const T&),
де Т – ім'я класу. Конструктор копіювання викликається|спричиняється| всякий|усякий| раз, коли виконується копіювання об'єктів, що належать класу. Зокрема він викликається|спричиняється|:
а) коли об'єкт передається функції по значенню;
б) при побудові|шикуванні| тимчасового об'єкту який повертає функція;
в) при використанні об'єкту для ініціалізації іншого об'єкту.
Якщо клас не містить|утримує| явним чином певного конструктора копіювання, то при виникненні одній з цих трьох ситуацій проводиться|виробляється,справляється| побітове копіювання об'єкту. Побітове копіювання не у всіх випадках є|з'являється,являється| адекватним. Саме для таких випадків і необхідно визначити власний конструктор копіювання. Наприклад, в класі string:
string(const string& st)
{len=strlen(st.len);
ch=new char[len+1];
strcpy(ch,st.ch); }
Можна створювати масив об'єктів, проте|однак| при цьому відповідний клас повинен мати конструктор за умовчанням (без параметрів).
Масив об'єктів може ініціалізуватися або автоматично конструктором за умовчанням, або явним привласненням значень кожному елементу масиву.
class demo{
int x;
public:
demo(){x=0;}
demo(int i){x=i;}
};
void main(){
class demo а[20]; //виклик конструктора без параметрів(за умовчанням)
class demo b[2]={demo(10),demo(100)};//явне привласнення
Деструктори.
Динамічне виділення пам'яті для об'єкту створює необхідність звільнення|визволення| цієї пам'яті при знищенні об'єкту. Наприклад, якщо об'єкт формується як локальний усередині блоку, то доцільно, щоб при виході з|із| блоку, коли вже об'єкт перестає існувати, виділена для нього пам'ять була повернена. Бажано, щоб звільнення|визволення| пам'яті відбувалося|походило| автоматично. Таку можливість|спроможність| забезпечує спеціальний компонент класу – деструктор класу. Його формат:
~ім’я_класу(){ оператори_тіла_деструктора}
Ім'я деструктора співпадає|збігається| з|із| ім'ям його класу, але|та| передує символом “~” (тильда).
Деструктор не має параметрів і не повертає ніякого значення. Виклик
деструктора виконується неявно (автоматично), як тільки об'єкт класу знищується.
Наприклад, при виході за область визначення або при виклику оператора delete для покажчика на об'єкт:
string *p=new string (“рядок”);
delete p;
Якщо в класі деструктор не визначено явно, то компілятор генерує деструктор за умовчанням, який просто звільняє|визволяє| пам'ять, зайняту|позичену,посісти| даними об'єкту. У тих випадках, коли потрібно виконати звільнення|визволення| і інших об'єктів пам'яті, наприклад область, на яку указує|вказує| ch в об'єкті string, необхідно визначити деструктор явно: ~string(){delete []ch;}
Так само, як і для конструктора, не може бути визначений покажчик на деструктор.
Покажчики на компоненти-функції.
Можна визначити покажчик на компоненти-функції.
тип_поверненого_значення(ім’я_класу::*ім’я_покажчика_на_функцію)
(специф_параметров_функции);
Приклад|зразок|.
double(complex : :*ptcom)(); // Визначення покажчика
ptcom = &complex : : real; // Настройка покажчика
// Тепер для об'єкту А можна викликати|спричинити| його функцію
complex A(5.2,2.7);
cout<<(A.*ptcom)();
Можна визначити також тип покажчика на функцію
typedef double&(complex::*PF)();
а потім визначити і сам покажчик
PF ptcom=&complex::real;
Завдання до лабораторної роботи №6
Вивчити правила створення об’єктів за допомогою мови С++ на прикладі програми, розглянутої в «Вказівках до виконання лабораторної роботи № 6». Перевірити роботу наведеного прикладу.
Визначити призначений для користувача клас відповідно до варіанту завдання|задавання|.
Визначити в класі наступні|слідуючі| конструктори: без параметрів, з|із| параметрами, копіювання.
Визначити в класі деструктор .
Визначити в класі компоненти-функції для перегляду|проглядання| і установки полів даних.
Визначити покажчик на компоненту-функцію|.
Визначити покажчик на екземпляр|примірник| класу.
Написати демонстраційну програму, в якій створюються і руйнуються об'єкти призначеного для користувача класу і кожен виклик конструктора і деструктора супроводжується|супроводиться| видачею відповідного повідомлення|сполучення| (який об'єкт який конструктор або деструктор викликав|спричинив|).
Показати в програмі використання покажчика на об'єкт і покажчика на компоненту-функцію|.
Приклад виконання лабораторної роботи №6.
Приклад | визначення класу STUDENT, який містить поля «ім'я», «вік», «рейтинг», конструктори трьох типів, деструктор а також функції-методи класу.
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(); };
Приклад|зразок| реалізації конструктора з|із| видачею повідомлення|сполучення|.
STUDENT::STUDENT(char*NAME,int AGE,float GRADE)
{
strcpy(name,NAME); age=AGE; grade=GRADE;
cout<< \nКонструктор з|із| параметрами викликаний|спричинений| для об'єкту
<<this<<endl;
}
Слід передбачити в програмі всі можливі способи виклику конструктора копіювання. Нагадуємо, що конструктор копіювання викликається|спричиняється|:
а) при використанні об'єкту для ініціалізації іншого об'єкту
Приклад|зразок|.
STUDENT а(“Иванов”,19,50) b=a;
б) коли об'єкт передається функції по значенню
Приклад|зразок|.
void View(STUDENT а){а.Show;}
в) при побудові|шикуванні| тимчасового об'єкту як повертаного значення функції
Приклад|зразок|.
STUDENT NoName(STUDENT & student)
{STUDENT temp(student);
temp.SetName(“NoName”);
return temp;}
STUDENT c=NoName(a);
У програмі необхідно передбачити розміщення об'єктів як в статичній, так і в динамічній пам'яті, а також створення|створіння| масивів об'єктів.
Приклади|зразки|.
а) масив студентів розміщується в статичній пам'яті
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);
і т.д.
Приклад|зразок| використання покажчика на компонентну функцію
void (STUDENT::*pf)();
pf=&STUDENT::Show;
(p[1].*pf)();
Програма використовує три файли:
заголовний h-файл з|із| визначенням класу
cpp-файл з|із| реалізацією класу
сpp-файл демонстраційної програми.
Для запобігання багатократному|багаторазовому| включенню|приєднанню| файлу-заголовка використовуються наступні директиви препроцесора
#ifndef STUDENTH
#define STUDENTH
// модуль STUDENT.H
...
#endif
Зміст|вміст,утримання| звіту
1. Титульний лист|аркуш|: назва дисципліни; номер і найменування роботи; прізвище, ім'я, по батькові студента; дата виконання.
2. Постановка завдання|задачі|. Слід дати конкретну постановку, тобто вказати, який клас повинен бути реалізований, які повинні бути в ньому конструктори, компоненти-функції і т.д.
3. Визначення призначеного для користувача класу з|із| коментарями.
4. Реалізація конструкторів і деструкторів.
5. Фрагмент програми, що показує використання покажчика на об'єкт і покажчика на функцію з|із| поясненням.
6. Лістинг основної програми, в якому повинно бути вказано, в якому місці і який конструктор або деструктор викликаються|спричиняються|.
|застосування|Варіанти завдань до лабораторної роботи № 6|задавань|
Описи членів - даних призначених для користувача класів
1. СТУДЕНТ ім'я – char* курс – int підлога|стать| – int(bool) |
2. СЛУЖБОВЕЦЬ ім'я – char* вік – int робочий стаж – int |
3. КАДРИ ім'я – char* номер цеху – int розряд – int |
4. ВИРІБ ім'я – char* шифр – char* кількість – int |
5. БІБЛІОТЕКА ім'я – char* автор – char* вартість – float |
6. ІСПИТ|екзамен| ім'я студента – char* дата – int оцінка – int |
7. АДРЕСА ім'я – char* вулиця – char* номер дому|будинку,хати| – int |
8. ТОВАР ім'я – char* кількість – int вартість – float |
9. КВИТАНЦІЯ номер – int дата – int сума – float |
10. ЦЕХ ім'я – char* начальник – char* кількість людей, що працюють – int |
11. ПЕРСОНА ім'я – char* вік – int стать|стать| – int(bool) |
12. АВТОМОБІЛЬ марка – char* потужність – int вартість| – float |
13. КРАЇНА ім'я – char* форма правління – char* площа| – float |
14. ТВАРИНА ім'я – char* клас – char* середня вага – int |
15. КОРАБЕЛЬ назва – char* водотоннажність – int тип – char* |
16. Хижак ім'я – char* ареал - char* кількість споживаної за місяць їжі – float |
17. Іграшка назва – char* тип – char* або enum вартість - float
|
18. Фільм назва – char* режисер – char* тривалість - float |
19. Дисципліна назва – char* спеціальність – char* об’єм лекц. годин – char* |
20. Басейн назва - char* ширина, довжина – float глибина біля вишки – float |
21. Тест назва дисципліни – char* кількість питань – int матриця вірних відповідей – int* |
22. ІСПИТ|екзамен| ім'я студента – char* дата – int оцінка – int |
23. ВИРІБ ім'я – char* шифр – char* кількість – int |
24. СЛУЖБОВЕЦЬ ім'я – char* вік – int робочий стаж – int |
25. ПЕРСОНА ім'я – char* вік – int стать|стать| – int(bool) |
26. БІБЛІОТЕКА ім'я – char* автор – char* вартість – float |
27. КВИТАНЦІЯ номер – int дата – int сума – float |
28. ТОВАР ім'я – char* кількість – int вартість – float |
29. ЦЕХ ім'я – char* начальник – char* кількість людей, що працюють – int |
30. ВОКЗАЛ назва – char* середня кількість пасажирів в день – float маршрути - сhar** |