Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

4.2 Деструктори.

Оскільки існують функції, які виконують ряд дій по конструюванню об’єкту, виникає необхідність у існуванні протилежних до них за дією функцій. Це особливо зрозуміло, якщо врахувати можливі дії конструкторів по виділенню пам’яті. Такі функції в С++ є і називаються вони деструкторами. Ім’я деструктора завжди починається з символа ~ за яким слідує ідентифікатор імені класу: ~ім’я_класу(); Деструктор не може мати параметрів. В класі може бути оголошений тiльки один деструктор.

Деструктор викликається автоматично при виходi об'єкту з областi видимостi.

class char_stack{

int size;

char *top;

char *s;

public:

char_stack(int sz){top=s=new char[size-sz];}

~char_stack(){delete s;}

void push(char c){*top++=c;}

char pop(){return *--top;}

};

Коли char_stack виходить з області видимості, викликається деструктор:

void f()

{ char_stack s1(100);

char_stack s2(200);

s1.push(’a’);

s2.push(s1.pop());

char ch=s2.pop();

cout<<chr(ch)<<“\n”;

}

При виклиці функції f() конструктор для char_stack викликається двічі:

для s1 щоб виділити вектор з 100 символів і для s2 для виділення поля з 200 символів. При виході з f() ці два вектора звільняються автоматично.

Розглянемо ше один приклад на використання конструкторів та деструк -торів. Нехай маємо такий клас Ttime :

class Ttime {

private:

long dt;

char*dts;

void DeleteDts(void);

publiс:

TTime();

TTime(int m,int d=-1,int y=-1,int hr=-1,int min=-1);

~TTime(); //деструктор

void SetTime (int m=-1,int d=-1,int y=-1,int hr=-1,int min=-1);

const char*GetsTime(void);

void ChangeTime(long nminutes)

{dt+=(nminutes*60);

DeleteDts();}

char * GetsTime(void)

{ if(dts) return dts;

dts = strdup(ctime(&dt));

return dts;

}

};

TTime ::TTime()

{dts=NULL;

Settime(-1,-1,-1,-1,-1);

}

TTime ::Ttime(int m,int d,int y,int m,int min)

{dts=NULL.

SetTime(m,d,y,hr,min);}

TTime ::~TTime()

{DeleteDts;}

Маємо фрагмент програми:

void f(void);

main()

{f();

return 0;}

void f(void)

{Ttime today;

const char *sp;

sp=today.GetsTime();

cout<<“ Second time :“<<sp;

}

В прикладі функція main() викликає функцію f(), всередині якої оголошується автоматичний об’єкт tuday класу Ttime, локальний в області видимості функції. Оскільки локальний автоматичний обєкт створюється разом з викликом функції, в якій він оголошений, С++ викликає для today конструктор Ttime в якості частини кода, що виконується функцією при запуску. Подібна операція виконується завжди при виклиці функції. Оскільки вказівник dts посилається на виділений блок пам’яті, то його потрібно звільнити при виході об’єкта з області видимості. Це і робить деструктор, який викликається автоматично. На відміну від конструктора, деструктор може бути викликаний явно.