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

Фактически для каждого создаваемого объекта на практике необходима инициализация. Для разрешения этой проблемы С++ предоставляет функцию - конструктор, включаемую в описание класса. Конструктор класса вызывается автоматически каждый раз при создании объекта этого класса.

Конструктор имеет то же имя, что и класс, частью которого он является, и не имеет возвращаемого значения. Рассмотрим сказанное на примере:

# include < iostream.h>

class myclass {

int a;

public:

myclass(); // конструктор

void show();

};

myclass:: myclass()

{

cout <<’’В конструкторе \n’’;

a=10;

}

void myclass::show()

{

cout << a;

}

main()

{

myclass ob;

ob.show();

return 0; }

В этом примере значение а инициализируется конструктором myclass(). Конструктор вызывается тогда, когда создается объект ob. Важно помнить, что в С++ оператор объявления является оператором действия.

Функцией обратной конструктору является функция - деструктор. Эта функция вызывается при удалении объекта. Когда работаешь с объектом, обычно при его удалении должны выполняться некоторые действия, например, освобождение памяти, занимаемой объектом. Для этого в объявление класса включается деструктор, описание которого задается символом ~ с последующим именем класса. Рассмотрим пример:

# include <iostream.h>

class myclass {

int a;

public:

myclass(); // конструктор

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

void show();

};

myclass::myclass()

{

cout << ‘’Cодержимое конструктора \n’’;

a = 10;

}

myclass::~myclass()

{

cout <<’’Удаление...\n’’;

}

void myclass::show()

{

cout << a << ‘’\n’’;

}

main()

{

myclass ob;

ob.show();

return 0;

}

В данном примере деструктор класса вызывается при окончании программы main(). Локальные объекты удаляются тогда, когда они выходят из поля видимости. Глобальные объекты удаляются при завершении программы. Применение конструкторов и деструкторов для действий, прямо не связанных с инициализацией, является очень плохим стилем программирования и его следует избегать. Рассмотрим применение конструктора и деструктора при создании простого класса для строк, который содержит саму строку и ее длину. Когда создается объект strtype, для хранения строки выделяется память, и начальная длина строки устанавливается равной начальному значению. Когда объект strtype удаляется, эта память освобождается. Будем использовать конструктор с параметром. Рассмотрим пример:

# include <iostream.h>

# include <malloc.h>

# include <string.h>

# include <stdlib.h>

class strtype

{

char *p; // p - указатель на переменную типа char

int len;

public:

strtype(char *ptr);

~strtype();

void show();

};

strtype:: strtype(char *ptr)

{

len = strlen(ptr);

p = (char *) malloc(len + 1);

if (!p) {

cout << ‘’ Ошибка выделения памяти \n’’;

exit(1);

}

strcpy(p,ptr);

}

strtype:: ~strtype()

{

cout << ‘’ Освобождение p\n’’;

free(p);

}

void strtype:: show()

{

cout << p<< ‘’-длина: ‘’ << len;

cout << ‘’\n’’;

}

main()

{

strtype s1(‘’Это проверка’’), s2(‘’ Мне нравится С++’’);

s1.show();

s2.show();

return 0;

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: