89790

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

Лекция

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

Для инициализации объектов класса в его определении можно включить специальную компонентную функцию (имя которой совпадает с именем класса), называемую конструктор.

Русский

2015-05-13

85.41 KB

2 чел.

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

Содержание

  1.  Конструктор
  •   в struct
  •   в class
  •   конструктор по умолчанию
  •   копирующий конструктор
  1.  Деструктор

Конструктор

Для инициализации объектов класса в его определении можно включить специальную компонентную функцию (имя которой совпадает с именем класса),  называемую  конструктор.

имя_класса ( список_формальных _параметров) { операторы_тела _конструктора }

  •  Нельзя получить адрес конструктора;
  •  Параметром конструктора не может быть его собственный класс, но может быть ссылка на него;
  •  Конструктор нельзя вызывать как обычную компонентную функцию.

Вызов конструктора:

имя_класса имя_объекта (не_пустой_список_фактических_параметров_конструктора);

имя_класса  * имя_указателя_на_объект_класса = new имя_класса (фактические_параметры_конструктора);

Конструкторы вызываются всякий раз, когда создается объект данного класса. Если список параметров пуст, то скобки можно не ставить, при этом вызывается конструктор по умолчанию. Конструктор с одним аргументом может производить преобразование типов, если при объявлении такого конструктора не используется ключевое слово explicit.

Рассмотрим конструкторы на примере класса goods:

class goods{

float price;

char *name;

int coun;

char prod[50];

}

Конструктор по умолчаниюэто конструктор без параметров. Его можно не определять, но в случае описания массива экземпляров класса, или если в классе описаны поля как указатели, то память автоматически не выделится, поэтому конструктор по умолчанию нужно обязательно прописать!

Пример конструктора по умолчанию:

goods(){

name=new char[1];  

name[0]='\0';

prod[0]='\0';

coun=0;

price=0.0;}

Перегрузка конструкторов

Конструкторов может быть несколько и они могут перегружаться, т.е. вызов того или иного конструктора зависит от входных параметров при инициализации экземпляров класса.

Инициализация данных объекта:

  •  с помощью конструктора через передачу значений параметров в тело конструктора
  •  применение списка инициализаторов данных объекта, который помещается между списком параметров и телом конструктора:

Имя_класса (список_параметров): список_инициализаторов_компонентных_данных {тело_конструктора};

Пример перегруженного конструктора со списком инициализаторов:

goods(float p, int c): coun(c), price(p){ name=new char[1]; name[0]='\0'; prod[0]='\0';}

goods(char *new_name, float new_price):coun(1), price(new_price){

name=new char [strlen(new_name)+1];

strcpy(prod,"magazine"); strcpy(name,new_name); }

Копирующий конструктор

При описании экземпляров класса, в котором существуют динамические поля данных, можно использовать инициализацию через оператор присваивания. В этом случае простая передача данных передаст только адрес указателя, а не сами данные.

Для корректной работы программы нужно описать копирующий конструктор.

Копирующим называется конструктор, который в списке параметров содержит параметр типа определяемого класса:

имя_класса (const имя_класса &);

имя_класса (const имя_класса &, int=0);

Вызов копирующего конструктора производится так

имя_класса имя1_объекта_типа_класс = имя2_объекта_типа_класс;

имя_класса имя1_объекта_типа_класс(имя2_объекта_типа_класс);

Пример копирующего конструктора:

goods (const goods& f){

name=new char[strlen(f.name)+1];

strcpy(name, f.name);

coun=f.coun;

price=f.price;

strcpy(prod, f.prod);}

Деструктор (разрушитель объектов)

Компонентная функция, предназначенная для освобождения памяти при уничтожении динамически созданного объекта, называется деструктором и имеет формат:

~имя_класса() {операторы_тела деструктора};

  •  Деструктор не имеет параметров (даже типа void).
  •  Деструктор не имеет возвращаемого значения.
  •  Вызов деструктора выполняется неявно, автоматически, как только объект класса уничтожается или завершается выполнение программы.

Пример описания деструктора:

~goods()

{

  delete name;

}

Пример # 3. Товары склада

#include <iostream>

#include <string.h>

using namespace std;

class goods{

float price;

char *name;

int coun;

char prod[50];

public:

goods(){

name=new char[1];  

name[0]='\0';

prod[0]='\0';

coun=0;

price=0.0;}

goods(float p, int c): coun(c), price(p){

name=new char[1]; name[0]='\0'; prod[0]='\0';}

goods(char *new_name, float new_price):coun(1), price(new_price){

name=new char [strlen(new_name)+1];

strcpy(prod,"magazine"); strcpy(name,new_name); }

goods (const goods& f){

name=new char[strlen(f.name)+1];

strcpy(name, f.name);

coun=f.coun;

price=f.price;

strcpy(prod, f.prod);}

~goods()

{

  delete name;

}

//Метод для вывода данных

void show(){ cout << name << ":“ << prod << «->“ << price << "*“ <<  

coun << "=“  << price*coun << endl;

}

};

//Главная программа

int main()

{

goods a("name",12.5);

goods c(56.0,100), d;

goods b=a;

a.show();    c.show();

d.show();    b.show();

return 0;

}

Пример #4. Символьная строка

Создадим класс «символьная строка». Определим следующие компоненты класса:

  •  Указатель на текстовую строку
  •  Длина строки
  •  Печатает информацию о строке

//stroka.cpp

#include <string.h>

#include <iostream.h>

#include <locale.h>

class stroka

{//скрытые от внешнего доступа данные

char *ch;

int len;

public://конструкторы объектов класса

stroka (int N=80): len(0)

{// выделяем память для массива строк

ch=new char[N+1];  ch[0]=‘\0’;}

// создает объект по заданной строке

stroka (const char *arch)

{len=strlen(arch); ch=new char[len+1]; strcpy(ch,arch);}

int& len_str(void)//возвращает ссылку на длину строки

{return len;}

char *strings(void)//возвращает указатель на строку                

{return ch;}

void display(void)//печатает  информацию о строке

{cout<<“\nДлина строки:”<<len;

cout<<“\nСодержимое строки:”<<ch;}

//Деструктор-освобождает память объекта

~stroka() { delete [] ch;} };

int main()

{

setlocale(LC_ALL,Russian”);

stroka s1,s2(5),s3("infoznaika");

cout << "Dlina stroki "<< s3.strings()<< "="<<s3.len_str()<< endl;

s2.display();

return 0;

}


 

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

52255. Композиція музичного твору. Форми в музиці. Сонатна форма 65.5 KB
  Товаром на уроціаукціоні є знання учнів які пропонуються у вигляді лотів. Підготовкою запитань лотів може займатися як сам вчитель так і купці учні. Купці можуть готувати по дватри лоти завдання під керівництвом і контролем учителя. Скарбник після кожного лоту виконаного завдання визначає середній бал кожного акціонерного товариства й записує результати у зведену таблицю.
52256. Аукціон фізичних знань 140.5 KB
  Команда яка швидше записала букви в кінці зірки і прочитала слово отримує 5 балів. Інша команда якщо вона правильно впоралась з завданням отримує 4 бали. Команда прослухавши повідомлення і розглянувши портрет відгадує ім'я вченого. За кожен правильно вгаданий портрет команда отримує по 3 бали.
52257. Організація закупівлі товарів на аукціонах 249.5 KB
  Інструкційно методична карта практичного заняття № 4 Тема: Організація підготовки і проведення аукціону. Навчальні цілі заняття: ознайомити студентів з планом проведення заняття ; І виявлення знань студентів по темі використовуючи різні форми і методи контролю; ІІ привити практичні навички оформлення акційних документів; ІІ навчити самостійно робити висновки вносити пропозиції щодо організації підготовки та проведення аукціону; ІІІ формувати особу спеціаліста з сучасним економічним мисленням здатну...
52259. Рельєф. Тектоніка. Геологічнабудова. Корисні копалини України 50.5 KB
  Корисні копалини України. Корисні копалини України. прищеплювати любов до України географії. Обладнання: Фізична карта України Тектонічна карта України магнітофон жетони гонг штатив молоточок таблиці атлас України 89 класи призи.
52260. Aus der Geschichte der Ukraine 50.5 KB
  Wie geht es euch Kinder Heute beginnen wir ein neues Them zu studieren. Es heißt Die Ukrine gestern und heuteâ. Dieses Them ht 10 Stunden. ber wie ds Them heutiger Stunde ist versteht ihr nch dieser ufgbe.
52261. Австралія – найменший материк Землі. Загальні відомості. Своєрідність географічного положення материка. Історія відкриття і дослідження. Рельєф і корисні копалини 7.75 MB
  Мета: сформувати в учнів загальне уявлення про своєрідність та особливості природи Австралії; продовжити формувати навички складати характеристику географічного положення материка; знайти закономірності розташування форм рельєфу та корисних копалин; розвивати вміння учнів працювати зі схемами атласу і підручника аргументувати свою відповідь у тому числі за допомогою додаткових джерел літератури. Для подальшого вивчення Австралії клас поділяється на групи: 1група. Знаходить на карті крайні точки Австралії і визначає їхні географічні...
52262. Australia. Terra Incognita 178 KB
  Terr Incognit Suggested level B 1 B1 intermedite Inn brmovsk senior techer of English school 5 L' viv Objectives: to get cquinted with ustrlin history geogrphy stte Symbols; to prctice vocbulry; to develop pupils' listening reding nd speking skills; to rouse pupils' interests in the life of ustrlin people. The Ntionl nthem...
52263. Австралійський Союз. Океанія 171 KB
  Мета: продовжити формувати систему знань про Австралію сформувати систему знань про природноресурсний потенціал Австралії і Океанії; систематизувати уявлення учнів про міжнародну спеціалізацію регіонів вдосконалити вміння і навички учнів самостійно працювати з джерелами географічної інформації. Обладнання: політична карта світу фізична карта Австралії фізична карта Океанії атласи учнівські...