Конструктор — это специальная функция, которая является членом класса и имя которой совпадает с именем класса. Вот, например, как стал выглядеть класс queue после переделки, связанной с применением конструктора для инициализации его членов.

// Определение класса queue.

class queue {

  int q[100];

  int sloc, rloc;

 public:

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

  void qput(int i);

  int qget();

};

Обратите внимание на то, что в объявлении конструктора queue() отсутствует тип возвращаемого значения. В C++ конструкторы не возвращают значений и, следовательно, нет смысла в указании их типа. (При этом нельзя указывать даже тип void.)

Теперь приведем код функции queue().

// Определение конструктора.

queue::queue()

{

 sloc = rloc = 0;

 cout << "Очередь инициализирована.\n";

}

В данном случае при выполнении конструктора выводится сообщение Очередь инициализирована., которое служит исключительно иллюстративным целям. На практике же в большинстве случаев конструкторы не выводят никаких сообщений.

Конструктор объекта вызывается при создании объекта. Это означает, что он вызывается при выполнении инструкции объявления объекта. Конструкторы глобальных объектов вызываются в самом начале выполнения программы, еще до обращения к функции main(). Что касается локальных объектов, то их конструкторы вызываются каждый раз, когда встречается объявление такого объекта.

Деструкторэто функция, которая вызывается при разрушении объекта.

Дополнением к конструктору служит деструктор. Во многих случаях при разрушении объекту необходимо выполнить некоторое действие или даже некоторую последовательность действий. Локальные объекты создаются при входе в блок, в котором они определены, и разрушаются при выходе из него. Глобальные объекты разрушаются при завершении программы. Существует множество факторов, обуславливающих необходимость деструктора. Например, объект должен освободить ранее выделенную для него память. В C++ именно деструктору поручается обработка процесса дезактивизации объекта. Имя деструктора совпадает с именем конструктора, но предваряется символом "~" Подобно конструкторам деструкторы не возвращают значений, а следовательно, в их объявлениях отсутствует тип возвращаемого значения.

Рассмотрим уже знакомый нам класс queue, но теперь он содержит конструктор и деструктор. (Справедливости ради отметим, что классу queue деструктор, по сути, не нужен, а его наличие здесь можно оправдать лишь иллюстративными целями.)

// Определение класса queue.

class queue {

  int q[100];

  int sloc, rloc;

 public:

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

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

  void qput(int i);

  int qget();

};

// Определение конструктора.

queue::queue()

{

 sloc = rloc = 0;

 cout << "Очередь инициализирована.\n";

}

// Определение деструктора.

queue::~queue()

{

 cout << "Очередь разрушена.\n";

}

Вот как выглядит новая версия программы реализации очереди, в которой демонстрируется использование конструктора и деструктора.

// Демонстрация использования конструктора и деструктора.

#include

using namespace std;

// Определение класса queue.

class queue {

  int q[100];

  int sloc, rloc;

 public:

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

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

  void qput(int i);

  int qget();

};

// Определение конструктора.

queue::queue()

{

 sloc = rloc = 0;

 cout << "Очередь инициализирована.\n";

}

// Определение деструктора.

queue::~queue()

{

 cout << "Очередь разрушена.\n";

}

// Занесение в очередь целочисленного значения.

void queue::qput(int i)

{

 if(sloc==100) {

  cout << "Очередь заполнена.\n";

  return;

 }

 sloc++;

 q[sloc] = i;

}

// Извлечение из очереди целочисленного значения.

int queue::qget()

{

 if(rloc == sloc) {

  cout << "Очередь пуста.\n";

  return 0;

 }

 rloc++;

 return q[rloc];

}

int main()

{

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги