Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.docx
Скачиваний:
6
Добавлен:
12.11.2019
Размер:
347.23 Кб
Скачать

Приклад|зразок|.

сomplex(double re1 = 0.0,double im1 = 0.0){re = re1; im = im1;}

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

Конструктор має ряд|лаву,низку| особливостей:

  1. Для конструктора не визначається тип значення, що повертається. Навіть тип void не припустимий.

  2. Покажчик на конструктор не може бути визначений, і відповідно не можна одержати|отримати| адресу конструктора.

  3. Конструктори не успадковуються|наслідують|.

  4. Конструктори не можуть бути описані з|із| ключовими|джерельними| словами 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

  1. Вивчити правила створення об’єктів за допомогою мови С++ на прикладі програми, розглянутої в «Вказівках до виконання лабораторної роботи № 6». Перевірити роботу наведеного прикладу.

  2. Визначити призначений для користувача клас відповідно до варіанту завдання|задавання|.

  3. Визначити в класі наступні|слідуючі| конструктори: без параметрів, з|із| параметрами, копіювання.

  4. Визначити в класі деструктор .

  5. Визначити в класі компоненти-функції для перегляду|проглядання| і установки полів даних.

  6. Визначити покажчик на компоненту-функцію|.

  7. Визначити покажчик на екземпляр|примірник| класу.

  8. Написати демонстраційну програму, в якій створюються і руйнуються об'єкти призначеного для користувача класу і кожен виклик конструктора і деструктора супроводжується|супроводиться| видачею відповідного повідомлення|сполучення| (який об'єкт який конструктор або деструктор викликав|спричинив|).

  9. Показати в програмі використання покажчика на об'єкт і покажчика на компоненту-функцію|.

Приклад виконання лабораторної роботи №6.

  1. Приклад | визначення класу 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;

}

  1. Слід передбачити в програмі всі можливі способи виклику конструктора копіювання. Нагадуємо, що конструктор копіювання викликається|спричиняється|:

а) при використанні об'єкту для ініціалізації іншого об'єкту

Приклад|зразок|.

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);

  1. У програмі необхідно передбачити розміщення об'єктів як в статичній, так і в динамічній пам'яті, а також створення|створіння| масивів об'єктів.

Приклади|зразки|.

а) масив студентів розміщується в статичній пам'яті

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);

і т.д.

  1. Приклад|зразок| використання покажчика на компонентну функцію

void (STUDENT::*pf)();

pf=&STUDENT::Show;

(p[1].*pf)();

  1. Програма використовує три файли:

  1. заголовний h-файл з|із| визначенням класу

  2. cpp-файл з|із| реалізацією класу

  3. сpp-файл демонстраційної програми.

  1. Для запобігання багатократному|багаторазовому| включенню|приєднанню| файлу-заголовка використовуються наступні директиви препроцесора

#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**

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]