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


 

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

77719. Интерфейс IDE 832.5 KB
  Интерфейс IDE широко используемый в запоминающих устройствах современных компьютеров разрабатывался как интерфейс жесткого диска. Правильный выбор интерфейса очень важен поскольку от этого зависит тип и быстродействие жесткого диска который можно установить в компьютер. Обычно при оценке быстродействия накопителя особенно жесткого диска в первую очередь обращают внимание на среднее время поиска т.
77720. Интерфейс SATA 2.12 MB
  Диски с интерфейсом Serial ATA разработаны для упрощения процедуры установки. Чтобы обеспечить правильную работу этих дисков, не требуется производить установку каких-либо перемычек, терминаторов или выполнять другие настройки. Блок перемычек, расположенный рядом с разъемом
77721. Кодирование данных с ограничением длины поля записи 64.5 KB
  Для жестких дисков вскоре был изобретен более эффективный метод кодирования информации: RLL. В случае с гибкими дисками новые методы уже не использовались в силу отсутствия необходимости в переносе больших объемов данных на гибких дисках это было бы достаточно не надежно а также в случае с гибкими дисками требуется совместимость новых стандартов кодирования и старых: любой современный дисковод может читать как FM так и MFMкодированные диски в то время как принцип RLLкодирования принципиально отличается от двух предыдущих. Этот тип...
77722. Накопители со сменными носителями 206.5 KB
  Помимо постоянно растущего желания увеличить объем доступной памяти существует также необходимость защиты и создания резервных копий имеющихся данных для чего может с успехом использоваться технология стационарных или переносных запоминающих устройств со сменными носителями. Эти устройства имеют довольно высокую эффективность и применяются как для записи нескольких файлов данных или редко используемых программ так и для создания полной копии жесткого диска на сменном диске или магнитной ленте. По мере роста объема и возможностей различных...
77723. Накопитель на жёстких магнитных дисках 76.5 KB
  В отличие от гибкого диска дискеты информация в НЖМД записывается на жёсткие алюминиевые или стеклянные пластины покрытые слоем ферромагнитного материала чаще всего двуокиси хрома. Расстояние между головкой и диском составляет несколько нанометров в современных дисках 510 нм а отсутствие механического контакта обеспечивает долгий срок службы устройства. Название Винчестер Название винчестер накопитель получил благодаря фирме IBM которая в 1973 году выпустила жёсткий диск модели 3340 впервые объединивший в одном неразъёмном...
77725. Подключение жестких дисков к компьютеру 119 KB
  Неправильное подключение разъемов кабеля к жесткому диску или системной плате не ведет с необходимостью к повреждению электроники диска или платы жесткий диск просто не распознается и не инициализируется BIOS. Включить компьютер и войти в SetupBIOS программу настройки BIOS бапзовой системы вводавывода нажав комбинацию клавиш высвечиваемую на экране компьютера во время его загрузки обычно клавиша Del. Сконфигурировать или убкдится в правильной конфигурации установленный жесткий диск задав параметры Type Cylinder Heds Sectors и...
77726. Интерфейсы внешних запоминающих устройств 200.5 KB
  ATA (Advanced Technology Attachment — присоединение по передовой технологии) — параллельный интерфейс подключения накопителей (жёстких дисков и оптических приводов) к компьютеру. В 1990-е годы был стандартом на платформе IBM PC; в настоящее время вытесняется своим последователем — SATA и с его появлением получил название PATA (Parallel ATA).
77727. Программное обеспечение для записи оптических дисков 342 KB
  Используются свободные проприетарные или встроенные в ОС средства для работы с оптическими дисками. Программы для записи оптических дисков shmpoo Burning Studio Free VS Dietor Burn4Free Brsero CDBurnerXP Cdrtools CloneCD Growisofs InfrRecorder ImgBurn k3b Nero Burning ROM ONES Opticl new edge Storge Roxio sonic Esy Medi Cretor WinOnCd WinOnCd для немецкого рынка то есть полный аналог программы Esy Medi Cretor Smll CDWriter TOST для Mc OS X JetBee FREE Complex Evolution и др. Рассмотрим использование ПО для записи...