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

   


Назад  |  Вперёд

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

              class vector
              {
              // ...
              public:
                 void init ( init 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 памяти, если на нее больше не ссылается ни один указатель (иными словами, не требуется автоматическая "сборка мусора"). В замен этого можно без вмешательства пользователя определить в классе собственные функции управления памятью. Это типичный способ применения конструкторов и деструкторов, хотя есть много не связанных с управлением памятью применений этих функций (см., например, $$9.4).


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.