Фактически для каждого создаваемого объекта на практике необходима инициализация. Для разрешения этой проблемы С++ предоставляет функцию - конструктор, включаемую в описание класса. Конструктор класса вызывается автоматически каждый раз при создании объекта этого класса.
Конструктор имеет то же имя, что и класс, частью которого он является, и не имеет возвращаемого значения. Рассмотрим сказанное на примере:
# 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;
}