17122

Використання конструкторів і деструкторів

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна робота № 31 Тема: Використання конструкторів і деструкторів Ціль роботи: вивчити і навчитися використовувати механізм роботи з конструкторами і деструкторами. Обладнання: ПКПО Borland C Теоретичні відомості Конструктори і деструктори Існує кільк

Украинкский

2013-06-29

58 KB

4 чел.


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

Тема: Використання конструкторів і деструкторів

Ціль роботи: вивчити і навчитися використовувати механізм роботи з конструкторами і деструкторами.

Обладнання: ПК,ПО Borland C++

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

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

Існує кілька спеціальних функцій-членів, що визначають, якої образом об'єкти класу створюються, ініціюється, копіюються і руйнуються. Конструктори і деструктори є найбільш важливими з них. Вони мають більшість характеристик звичайних функцій-членів: з'являються в класі і визначаються в межах чи класу поза ним. Однак, вони володіють і деякими унікальними властивостями:

  1.  Вони мають ім'я, що збігається з ім'ям класу (деструктори із символом тильди ~)
  2.  Конструкторів може бути трохи, деструктор тільки один.
  3.  Вони не мають оголошень типу значень, що повертаються, (навіть void).
  4.  Вони не можуть бути успадковані, хоча похідний клас може викликати конструкторы і деструктор базового класу.
  5.  Конструктори, як і більшість функцій мови С++, можуть мати аргументи за замовчуванням чи використовувати списки ініціалізації елементів.
  6.  Деструктори можуть мати атрибут virtual, але конструктори не можуть.
  7.  Не можна працювати з адресами цих функцій.

Приклад

void *ptr=base::base; // неприпустимо, base()-функція-конструктор класу base

  1.  Викликати конструктор тим же образом, що і звичайну функцію, не можна. Виклик деструктора допустимо тільки з цілком уточненим ім'ям.

Приклади

X *p;            // покажчик на клас Х

X x;              // оголошення об'єкта х класу Х

p=&x;          //покажчик p зберігає адреса об'єкта х

p->X::~X(); // припустимий виклик деструктора

X::X();         // неприпустимий виклик конструктора

  1.  При оголошенні об'єктів компілятор викликає один з конструкторів автоматично.
  2.  Аналогічно при знищенні об'єктів компілятор автоматично викликає деструктор.
  3.  Конструктори і деструктори при необхідності динамічного виділення  об'єкту пам'яті можуть виконувати виклики операторів new і delete.
  4.  Конструктор створює об'єкт х і ініціює його член дані-члени. При копіюванні об'єкта даного класу відбувається неявний виклик відповідного конструктора. Член^-дан-члени об'єкта класу, у якого всі елементи загальнодоступні (public) і без чи конструкторів базових класів (звичайно це структура) можуть ініціювати за допомогою списку ініціалізаторів. Деструктор руйнує об'єкт класу, створений конструктором, коли цей об'єкт виходить з області видимості.

Конструктори глобальних об'єктів викликаються до виклику функції main().

Локальні об'єкти створюються, як тільки стає активної область дії (видимості) об'єкта. При цьому конструктор викликається щораз.

class Х

{...public:

X();                 // конструктор класу Х за замовчуванням

                          // X(X); неприпустимо

Х(const X&); // конструктор копіювання – передається посилання на Х

~X( );              // деструктор класу Х 

};

Формальні параметри конструктора при його оголошенні можуть бути будь-якого типу, за винятком класу, елементом якого є даний конструктор. Конструктор копіювання приймає як параметр посилання на свій власний клас. Конструктор, що не сприймає параметрів, називається конструктором за замовчуванням: Х::Х().

Х х; // оголошений об'єкт х класу Х, викликається конструктор за замовчуванням

Як і усі функції-члени, конструктори можуть мати аргументи, використовувані за замовчуванням. Наприклад, можливі наступні оголошення конструкторів у класі:

Оголошення класу

Визначення конструкторів поза класом

class X

{ int I, j  по- умовчанню private

public:

X();       // конструктор за замовчуванням

X(int ); // перевантажені конструктори

X(int, int ); // можуть викликатися c одним 

// X(int) чи двома X(int, int) аргументами

X(int а = 5, int у= 6); //може викликатися без чи аргументів з одним чи двома

// аргументами

X(const &); // конструктор копіювання

};

Х::Х{і=(; j=(}

Х::Х(int a )   {і=a;

                        j=(;}

Х::Х(int a, int b)

{i=a; j=b;}

При виклику конструкторів варто  уникати неоднозначностей main()

Ініціалізація об'єктів класу

Об'єкти класів з конструкторами можуть ініціюватися за допомогою списків, що задаються в круглих дужках, ініціалізаторів. Цей список використовується як список переданих конструктору аргументів

main()

{

X one; // викликається конструктор X::X() за замовчуванням для об'єкта one

// класу Х

X two(1);     // використовується конструктор X::X(int)

X three = 1; // викликається X::X(int) – альтернативна форма зі знаком (=)

Х three(10, 8) // використовувати не можна, неоднозначно заданий конструктор

// X::X(int а=5, int b=6)

X four = one; // викликається X::X(const X&) для копіювання

// об'єкта one у four

X five(two);  // викликає X::X(cont X&) для копіювання об'єкта two у five

}

Конструктор сприймає значення як параметри і виконує присвоювання даним членам у тілі функції конструктора. Визначення конструктора як і будь-який функції-члена може вироблятися в тілі класу

class X

{

int i, j;

public:

X(int a, int b) { i = a; j = b } // визначення конструктора в класі, він має

// доступ к і и j

X(int a, int b) : a(i), b(j) {}  // альтернативна форма для ініціалізації а і b

}; i(a), j(b)

В обох випадках ініціалізації X x(1, 2) привласнює значення x::i=1 і значення x::j=2.

Деструктори

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

class X

{…

public:

X();  // деструктор класу X

};

Якщо деструктор не оголошений для класу явно, компілятор генерує його автоматично.

Виклик деструкторів

Виклик деструктора виконується неявно, коли об'єкт виходить зі своєї оголошеної області дії. Для локальних перемінні деструктори викликаються, коли перестає бути активним блок, у якому вони оголошені. У випадку глобальних перемінні деструктори викликаються як частина процедури виходу після функції main(). Необхідність деструкторів у значній мірі зв'язана з покажчиками і динамічним виділенням пам'яті.

Коли покажчики, зв'язані з об'єктами, виходять за межі області дії, неявного виклику деструктора не відбувається. Це значить, що для знищення такого об'єкта оператор delete повинний задаватися явно.

Деструктори викликаються в зворотній послідовності щодо виклику конструкторів, тобто спочатку викликаються деструктори похідних класів, потім базових – нагору по ієрархії.

При виході з програми з використанням функції exit() деструктори для яких-небудь локальних перемінних у поточній області дії не викликаються. Глобальні перемінні знищуються в звичайній послідовності.

При виклику abort() де-небудь із програми деструктори не викликаються навіть для перемінних глобальний області дії.

Деструктор може викликатися одним із двох способів: побічно, через виклик delete, чи безпосередньо, шляхом завдання цілком уточненого імені деструктора. Delete використовується для знищення тих об'єктів, для яких пам'ять розподілялася за допомогою new. Явний виклик деструктора необхідний тільки у випадку об'єктів, яким за допомогою виклику new динамічно розподіляти пам'ять.

Приклади:

class X {

{...

X();

...

};

void* operator new(size_t size, void *ptr)

{

return ptr;

}

char buffer[sizeof(X)];

main()

{

X* pointer = new X;  // пам'ять для

// об'єкта класу Х виділена в купі

X* exact_pointer;

exact_pointer =

(Х)new(sizeif (X)&buffer) X; 

// покажчик ініціюється адресою // буфера

...

delete pointer;       // delete служить // для руйнування покажчика

exact_pointer->X::-X(); // прямий виклик для скасування розподілу // пам'яті

}

Приклад програми на С++

#include<iostream.h>

#include<math.h>

class Prom{

public:

 Prom();

 ~Prom();

 void coutr();

 void cinr();

private:

 char *name,*cena,*number;

};

Prom::Prom()

{name=new char[20];

cena=new char[20];

number=new char[20];

}

Prom::~Prom()

{delete[]name;

delete[]cena;

delete[]number;

}

void Prom::cinr()

{cout<<"Vvedite nazvaniye izdeliya: ";

cin>>name;

cout<<"Vvedite cenu izdeliya: ";

cin>>cena;

cout<<"Vvetite kollichestvo izdeliy: ";

cin>>number;

cout<<"-----\n";

}

void Prom::coutr()

{cout<<"Nazvaniye izdeliya: "<<name<<"\nCena izdeliya: "<<cena;

cout<<"\nKollichestvo izdeliy: "<<number<<"\n-----\n";

}

void main()

{int n,k;

cout<<"Vvedite chislo isdeliy: \n";

cin>>n;

Prom*arr=new Prom[n];

for(k=0;k<n;k++)

 arr[k].cinr();

cout<<"__________\n";

for(k=0;k<n;k++)

 arr[k].coutr();

delete[]arr;

}

Хід роботи

  1.  Вивчити теоретичні відомості.
  2.  Відповідно до індивідуального завдання для попередньої лабораторної роботи розробити конструктори і деструктор для заданого класу. Здійснити ініціалізацію об'єктів класу різними конструкторами. Розмістити об'єкт класу в динамічній пам'яті і зруйнувати його після використання в програмі.
  3.  Набрати програму на комп'ютері й усунути помилки.
  4.  Одержати результат.
  5.  Оформити звіт.
  6.  Підготуватися до захисту лабораторної роботи, вивчивши контрольні питання по даній темі.

Вимоги до змісту звіту приведені в лабораторній   роботі   №1.

Контрольні запитання

  1.  Навіщо використовуються конструктори і деструктори?
  2.  Яке ім'я має конструктор і деструктор?
  3.  Скільки конструкторів і деструкторів може бути в класі?
  4.  Чи можна виконати ініціалізацію дан-членів без конструктора?
  5.  Назвіть відмінності конструкторів і деструкторів від інших функцій
  6.  Чи можна явно викликати конструктор і деструктор?
  7.  Чи можна передати параметри в конструктори, використовувати параметри за замовчуванням?
  8.  Як визначити викликуваний конструктор, якщо їхній трохи?
  9.  Що таке конструктор за замовчуванням, конструктор копії?
  10.  Приведіть синтаксис оголошення, визначення і використання конструкторів, які альтернативні варіанти припустимі?
  11.  Поясните приведені приклади.
  12.  Для чого необхідні оператора new і delete.
  13.  Коли викликаються деструктори для локальних і глобальних перемінних
  14.  Як відбувається виклик деструкторів при виході з програми, при виклику функцій ехit(), abord()?


 

А также другие работы, которые могут Вас заинтересовать

1986. Разработка биотехнологии вакцины чумной живой сухой со сниженным количеством человеко-доз в производственной упаковке (ампуле) 1.14 MB
  Современное состояние и перспективы совершенствования эффективности чумных вакцин. Пути совершенствования биологических показателей вакцины чумной живой на этапах сведения, разлива и лиофилизации бактериальной суспензии. Смыв бактериальной массы с поверхности агара с последующим приготовлением необходимой концентрации микробных клеток, разлив, лиофилизация вакцины. Изучение реактогенности различных образцов вакцины чумной живой сухой.
1987. Политический терроризм: детерминация и формы проявления 1.13 MB
  Политический терроризм: категориальный анализ. Политический терроризм и другие виды политического насилия: грани соотношения. Политический терроризм как форма этнического экстремизма. Основные направления преодоления политического терроризма.
1988. Жанр письмо вождю в тоталитарную эпоху 1.13 MB
  Письмо вождю в русле мировой и русской эпистолярной традиции. Жанровая специфика. Причины актуализации. Письмо вождю: жанровые разновидности. Образ адресанта.
1989. Миграционные процессы на Ставрополье во второй половине ХХ века: историко-культурный аспект. 1.11 MB
  Миграция как социально-демографический процесс. Теоретические аспекты миграционных процессов. Исторические традиции и новации в миграционных процессах на Ставрополье во второй половине ХХ века. Проблемы социокультурной жизни Ставрополья через призму миграций. Национально-культурное взаимодействие мигрантов с местным населением.
1990. Разраничение полномочий между органами государственной власти Российской Федерации и ее субъектов по предметам совместного ведения 1.12 MB
  Теоретические основы разграничения полномочий между органами государственной власти Российской Федерации и ее субъектов по предметам совместного ведения. Совершенствование конституционно-правовых основ разграничения полномочий между органами государственной власти Российской Федерации и ее субъектов по предметам совместного ведения.
1991. Эффективная работа SolidWorks 2005 36.34 MB
  Построение эскизов твердотельных моделей, добавление на эскиз геометрических взаимосвязей. Альтернативные методики простановки размеров и параметров элементов. Профессиональные инструменты моделирования.
1992. Русско-Французский билингвизм российского дворянства первой половины XIX века 1.13 MB
  Билингвизм как культурный феномен. Коммуникативные ситуации и речевой этикет в условиях русско-французского билингвизма русский дворян начала XIX века. Дворянское эпистолярное наследие первой половины XIX века с точки зрения билингвизма.
1993. Принципы доступности и коммуникативной направленности обучения студентов в условиях применения инфокоммуникационных технологий 1.13 MB
  Принципы как методологическая основа обучения студентов и педагогическая проблема. Создание и реализация дидактических информационных сред и технологических структур как условие доступности и коммуникативной направленности студентов.
1994. Правовое регулирование оказания Интернет-услуг 1.12 MB
  Общая характеристика обязательств по оказанию услуг. Развитие российского законодательства, регулирующего оказание Интернет-услуг. Обязательства, возникающие в результате обмена данными (электронными документами). Договоры подключения оконечного оборудования абонента к международной сети электросвязи Интернет.