Язык программирования C++ для профессионалов
d51f8a0c

Инициализация и удаление


Когда представление типа скрыто, необходимо дать пользователю средства для инициализации переменных этого типа. Простейшее решение - до использования переменной вызывать некоторую функцию для ее инициализации.

Например:

class vector { // ... public: void init ( int size ); // вызов init () перед первым // использованием объекта vector // ... };

void f () { vector v; // пока v нельзя использовать v.init ( 10 ); // теперь можно }

Но это некрасивое и чреватое ошибками решение. Будет лучше, если создатель типа определит для инициализации переменных некоторую специальную функцию. Если такая функция есть, то две независимые операции размещения и инициализации переменной совмещаются в одной (иногда ее называют инсталляцией или просто построением). Функция инициализации называется конструктором. Конструктор выделяется среди всех прочих функций данного класса тем, что имеет такое же имя, как и сам класс. Если объекты некоторого типа строятся нетривиально, то нужна еще одна дополнительная операция для удаления их после последнего использования. Функция удаления в С++ называется деструктором. Деструктор имеет то же имя, что и его класс, но перед ним стоит символ ~ (в С++ этот символ используется для операции дополнения). Приведем пример:

class vector { int sz; // число элементов int * v; // указатель на целые public: vector ( int ); // конструктор ~vector (); // деструктор int& operator [] ( int index ); // операция индексации };

Конструктор класса vector можно использовать для контроля над ошибками и выделения памяти:

vector::vector ( int s ) { if ( s <= 0 ) error ( "недопустимый размер вектора" ); sz = s; v = new int [ s ]; // разместить массив из s целых }

Деструктор класса vector освобождает использовавшуюся память:

vector::~vector () { delete [] v; // освободить массив, на который // настроен указатель v }

От реализации С++ не требуется освобождения выделенной с помощью new памяти, если на нее больше не ссылается ни один указатель (иными словами, не требуется автоматическая "сборка мусора"). В замен этого можно без вмешательства пользователя определить в классе собственные функции управления памятью. Это типичный способ применения конструкторов и деструкторов, хотя есть много не связанных с управлением памятью применений этих функций.



Содержание раздела