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()

{

 queue a(1), b(2); // Создание двух объектов класса queue.

 a.qput(10);

 b.qput(19);

 a.qput(20);

 return 0;

}

При выполнении эта версия программы генерирует такие результаты:

Очередь 1 инициализирована.

Очередь 2 инициализирована.

10 20 19 1

Очередь 2 разрушена.

Очередь 1 разрушена.

Как видно из кода функции main(), очереди, связанной с именем а, присваивается идентификационный номер 1, а очереди, связанной с именем b, — идентификационный номер 2.

Несмотря на то что в примере с использованием класса queue при создании объекта передается только один аргумент, в общем случае возможна передача двух аргументов и более. В следующем примере объектам типа widget передается два значения.

#include

using namespace std;

class widget {

  int i;

  int j;

 public:

  widget(int a, int b);

  void put_widget();

};

// Передаем 2 аргумента конструктору widget().

widget::widget(int a, int b)

{

 i = a; j = b;

}

void widget::put_widget()

{

 cout << i << " " << j << "\n";

}

int main()

{

 widget x(10, 20), y(0, 0);

 x.put_widget();

 у.put_widget();

 return 0;

}

Важно! В отличие от конструкторов, деструкторы не могут иметь параметров. Причину понять нетрудно: не существует средств передачи аргументов объекту, который разрушается. Если же у вас возникнет та редкая ситуация, когда при вызове деструктора вашему объекту необходимо получить доступ к некоторым данным, определяемым только во время выполнения программы, создайте для этой цели специальную переменную. Затем непосредственно перед разрушением объекта установите эту переменную равной нужному значению.

При выполнении эта программа отображает следующие результаты.

10 20

0 0

Альтернативный вариант инициализации объекта

Если конструктор принимает только один параметр, можно использовать альтернативный способ инициализации членов объекта. Рассмотрим следующую программу.

#include

using namespace std;

class myclass {

  int a;

 public:

  myclass(int x);

  int get_a();

};

myclass::myclass(int x)

{

 a = x;

}

int myclass::get_a()

{

 return a;

}

int main()

{

 myclass ob = 4; // вызов функции myclass(4)

 cout << ob.get_a();

 return 0;

}

Здесь конструктор для объектов класса myclass принимает только один параметр. Обратите внимание на то, как в функции main() объявляется объект ob. Для этого используется такой формат объявления:

myclass ob = 4;

В этой форме инициализации объекта число 4 автоматически передается параметру х при вызове конструктора myclass(). Другими словами, эта инструкция объявления обрабатывается компилятором так, как если бы она была записана следующим образом.

myclass ob = myclass(4);

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

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

Классы и структуры — родственные типы
Перейти на страницу:

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

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