Параметризованные конструкторы



 

Конструктор может иметь параметры. С их помощью при создании объекта членам данных (переменным класса) можно присвоить некоторые начальные значения, определяемые в программе. Это реализуется путем передачи аргументов конструктору объекта. В следующем примере мы усовершенствуем класс queue так, чтобы он принимал аргументы, которые будут служить идентификационными номерами (ID ) очереди. Прежде всего необходимо внести изменения в определение класса queue . Теперь оно выглядит так.

 

 

Переменная who используется для хранения идентификационного номера (ID ) создаваемой программой очереди. Ее реальное значение определяется значением, передаваемым конструктору в качестве параметра id , при создании переменной типа queue . Конструктор queue() выглядит теперь следующим образом.

 

 

Чтобы передать аргумент конструктору, необходимо связать этот аргумент с объектом при объявлении объекта. C++ поддерживает два способа реализации такого связывания. Вот как выглядит первый способ.

 

 

В этом объявлении создается очередь с именем a , которой передается значение (идентификационный номер) 101 . Но эта форма (в таком контексте) используется редко, поскольку второй способ имеет более короткую запись и удобнее для использования. Во втором способе аргумент должен следовать за именем объекта и заключаться в круглые скобки. Например, следующая инструкция эквивалентна предыдущему объявлению,

 

 

Это самый распространенный способ объявления параметризованных объектов. Опираясь на этот метод, приведем общий формат передачи аргументов конструкторам.

 

 

Здесь элемент список_аргументов представляет собой список разделенных запятыми аргументов, передаваемых конструктору.

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

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

 

 

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

 

 

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

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

 

 

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

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

 

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

 

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

 

 

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

 

 

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

 

 

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

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

 


Дата добавления: 2018-09-22; просмотров: 560; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!