Конструктори і деструктори, програмування на c і c
Перед використанням об'єкта може знадобитися форматувати деякі його дані. Для прикладу розглянемо клас queue, визначений вище в цьому розділі. Перед тим як вико-ти queue, необхідно присвоїти змінним rloc і sloc значення 0, використовуючи функцію init (). Оскільки вимога ініціалізації є надзвичайно поширеним, то С ++ позво-ляет проводити ініціалізацію об'єктів під час їх створення. Така автоматична иници-ализация виконується за допомогою функції, яка називається конструктором.
Функція-конструктор, що є членом класу і має ім'я, що збігається з ім'ям класу, являє собою спеціальний тип функції. Як приклад нижче показано, як виглядає клас queue, перетворений таким чином, щоб використовувати для ініціалізації конструктор:
/ / Створення класу чергу
class queue int q [100];
int sloc, rloc;
public:
queue (); // конструктор
void qput (int i);
int qget ();
>;
Звернемо увагу, що конструктор queue () не має типу значення, що повертається. В С ++ функції-конструктори не можуть повертати значень.
Код, який реалізує функцію queue (), виглядає наступним чином:
// конструктор
queue. queue ()
sloc = rloc = 0;
cout <<"Queue initialized. \n";
>
Звернемо увагу, що виведене повідомлення «queue initialized» служить для ілюстрації рабо-ти конструктора. У звичайній практиці більшість конструкторів не займаються виведенням або введенням даних. Вони служать для ініціалізації.
Доповненням конструктора є деструкція. У багатьох випадках перед знищенням об'єкта необхідно виконати певні дії. Локальні об'єкти створюються при вході в соот-ний блок програми і руйнуються при виході з нього. Глобальні об'єкти знищити-жаются при завершенні роботи програми. Є багато причин того, щоб існував деструктор. Наприклад, може знадобитися звільнити пам'ять, яка була раніше зарезерві-рована. В С ++ за дезактивацію відповідає деструктор. Він має те ж саме ім'я, що і конструк-тор, тільки до нього доданий значок
Нижче представлений варіант класу queue, який використовує конструктор і деструктор. (Слід мати на увазі, що клас queue не потребує деструкції, тому нижче він приведений тільки для ілюстрації.)
// створення класу чергу
class queue int q [100];
int sloc, rloc;
public:
queue (); // конструктор
queue (); // деструктор
void gput (int i);
int qget ();
>;
// конструктор
queue :: queue ()
sloc = rloc = 0;
cout <<"Queue initialized.\n";
>
// деструктор
queue.
queue ()
cout <<"Queue destroyed.\n";
>
Для того щоб продемонструвати роботу конструктора і деструктора, нижче представлена но-вая версія програми:
#include
// створення класу чергу
class queue int q [100];
int sloc, rloc;
public:
queue (); // конструктор
queue (); // деструктор
void gput (int i);
int qget ();
>;
/ / Конструктор
queue :: queue ()
sloc = rloc = 0;
cout <<"Queue initialized.\n";
>
// деструктор
queue ::
queue ()
cout <<"Queue destroyed.\n";
>
void queue :: qput (int i)
if (sloc == 99) cout <<"Queue is full.\n";
return;
>
sloc ++;
q [sloc] = i;
>
int queue :: qget ()
if (rloc == sloc) cout <<"Queue underflow.\n";
return 0;
>
rloc ++;
return q [rloc];
>
int main ()
queue a, b; // створення двох об'єктів типу queue
a.qput (10);
b.qput (19);
a.qput (20);
b.qput (1);
cout <
>
Ця програма виводить на екран наступний текст:
Queue initialized.
Queue initialized.
10 20 19 1
Queue destroyed.
Queue destroyed.