Общий формат объявления класса



 

Все классы объявляются подобно приведенному выше классу queue . Общий формат объявления класса имеет следующий вид.

 

 

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

 

Доступ к членам класса

 

Получение доступа к членам класса – вот что часто приводит в замешательство начинающих программистов. Поэтому остановимся на этой теме подробнее. Итак, рассмотрим следующий простой класс.

 

 

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

 

 

Теперь рассмотрим, как осуществляется доступ к членам класса myclass . Прежде всего обратите внимание на то, что для присвоения значений переменным а и b в функции setab() используются следующие строки кода.

 

 

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

Теперь обратите внимание на то, что переменная b – открытый (public ) член класса myclass . Это означает, что к b можно получить доступ из кода, определенного вне тела класса myclass . Следующая строка кода из функции main() , при выполнении которой переменной b присваивается число 20 , демонстрирует реализацию такого прямого доступа.

 

 

Поскольку эта инструкция не принадлежит телу класса myclass , то к переменной b возможен доступ только с использованием конкретного объекта (в данном случае объекта ob ) и оператора "точка" .

Теперь обратите внимание на то, как вызывается функция‑член reset() из функции main().

 

 

Поскольку функция reset() является открытым членом класса, ее также можно вызвать из кода, определенного вне тела класса myclass , и посредством конкретного объекта (в данном случае объекта ob ).

Наконец, рассмотрим код функции reset() . Тот факт, что она является функцией‑членом, позволяет ей непосредственно обращаться к другим членам того же класса, не используя оператор "точка" или конкретный объект. В данном случае она вызывает функцию‑член setab() . И снова‑таки, поскольку объект уже известен (он используется для вызова функции reset() ), нет никакой необходимости указывать его еще раз.

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

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

 

Конструкторы и деструкторы

 

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

Как правило, некоторую часть объекта, прежде чем его можно будет использовать, необходимо инициализировать. Например, рассмотрим класс queue (он представлен выше в этой главе). Прежде чем класс queue можно будет использовать, переменным rloc и sloc нужно присвоить нулевые значения. В данном конкретном случае это требование выполнялось с помощью функции init() . Но, поскольку требование инициализации членов класса весьма распространено, в C++ предусмотрена реализация этой возможности при создании объектов класса. Такая автоматическая инициализация выполняется благодаря использованию конструктора.

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

 

 

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

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

 

 

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

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

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

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

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

 

 

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

 

 

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

 


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

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






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