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()?


 

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

58659. Имена собственные 44 KB
  На экране видеофрагмент мультфильма Трое из Простоквашино затем появляется тема урока. На экране появляется рубрика Словарный диктант и галчонок Хватайка. Проверьте записанное в тетради с ответами на экране.
58660. Сочинение по картине К.Ф. Юона «Волшебница зима» 43 KB
  Задачи урока: познакомить с творчеством К.Ф.Юона; учить читать картину, осмысливать ее содержание; привлечь внимание детей к красоте зимней природы; формировать умение строить текст...
58661. Изменение глаголов по временам 45 KB
  Ребята откройте свои тетради и запишите число и классная работа. Учитель: Я буду загадывать загадки а отгадку вы будете записывать в тетрадь. Учитель: Что это по одному ученику выходят к доске Запишите слово ставя ударение и подчеркивая орфограммы .
58662. Морфологический разбор имени прилагательного 41.5 KB
  Напомню что наша тема называется морфологический разбор имени прилагательного. Во-вторых постоянные признаки разряд прилагательного: качественное относительное или притяжательное непостоянные признаки число род падеж.
58664. Имя существительное 37.5 KB
  Какие у вас возникли вопросы Как называется На какие вопросы отвечает Что обозначает Это и есть цель нашей деятельности. Мы: 1 познакомимся с новой частью речи; 2 узнаем на какие вопросы она отвечает; 3 а также научимся распознавать её среди других слов.
58665. Изменение имен существительных по числам 51.5 KB
  Цель урока: Развивать умение изменять существительные по числам различать род. Образовательные цели научиться употреблять в речи имена существительные классифицировать их;...
58666. М.В.Ломоносов. Оды 48.5 KB
  В чём необычность курса обучения пройденного Ломоносовым Что такое теория трёх штилей 2 Запись в тетрадях. Он ценит в царе то что он царствуя служил свои законы сам примером утвердил монаршу власть скрывал чтоб нам открыть науки о том как...
58667. Отечественная война 1812 года 37 KB
  Цель: Создать условия для формирования исторического представления об Отечественной войне 1812 года на уроке истории при помощи ЦОР Задачи: Образовательные: познакомить с событиями Отечественной войны 1812 года, научить анализировать историческую видео информацию...