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


 

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

10407. Современная система международных отношений: проблемы и противоречия 37.5 KB
  Современная система международных отношений: проблемы и противоречия. Международные отношения более сложное явление чем внешняя политика Это совокупность экономических политических идеологических правовых военных информационных дипломатических и других
10408. Глобальный и региональный аспекты международной безопасности в мире 42 KB
  Глобальный и региональный аспекты международной безопасности в мире. В наши дни в условиях все возрастающей взаимозависимости и взаимосвязи государств на мировой арене становится необходимым изучение не только политических систем отдельно взятых государств но и м...
10409. Понятие национального интереса. Приоритеты внутренней и внешней политики РФ. 40 KB
  Понятие национального интереса. Приоритеты внутренней и внешней политики РФ. Современный мир характеризуется переходом к многополярному мироустройству. Растет многообразие политического экономического и культурного развития стран идет поиск на национальном и ре...
10410. Проблемы политической социализации личности 26 KB
  Проблемы политической социализации личности. Среди множества факторов способствующих сохранению политической системы социализация индивида занимает важное место поскольку ни одна система не сможет достигнуть достаточного уровня интеграции и стабильности если ...
10411. Политическое поведение личности как категория в политологии 35.5 KB
  Политическое поведение личности как категория в политологии. В самом общем виде действие социальных норм состоит: а в установлении типов образцов общественно значимого поведения; б в установлении границ в пределах которых индивидуальное поведение служит осуществл...
10412. Проблемы политического лидерства в обществе. Основные типы политических лидеров 29 KB
  Проблемы политического лидерства в обществе. Основные типы политических лидеров. Понятие лидер€ происходит от английского leader что означает ведущий управляющий другими людьми. Становление и функционирование лидеров объективное и универсальное явление. С понят...
10413. Социально-политические и этнические конфликты 51.5 KB
  Социальнополитические и этнические конфликты. Конфликты в современных условиях отличаются остротой и частым применением насилия. На основе углубления кризисного состояния общества приводящего к столкновениям различных сил и общностей обостряются социальные проти
10414. Социальная дифференциация общества: классовая теория, теория социальной стратификации 23.5 KB
  Социальная дифференциация общества: классовая теория теория социальной стратификации. Социально-классовая стр. Маркса: Появление классов связано с историческими определениями фазами развития производства Классовая борьба ведет к диктатуре пролеториата ...
10415. Общественно-политические движения и организации и формы проявления плюрализма интересов 34.5 KB
  Общественнополитические движения и организации и формы проявления плюрализма интересов. Общественные движения и организации добровольные формирования возникшие в результате свободного волеизъявления граждан объединяющихся на основе общих интересов и целей. Общ