- •Лекция № 4 Тема: Классы и обьэкты Visual c. Использование конструкторов и деструкторов в пакете Visual c план
- •Понятие класса и объекта. Спецификаторы доступа к членам класса
- •Объявления или спецификация класса
- •Int m_year; / / год издания
- •Реализация класса
- •Использование конструкторов и деструкторов в пакете Visual c
Объявления или спецификация класса
Объявление класса (class declaration) представляет собой описание членов класса: данных и методов. Часто объявление класса называют спецификацией. Члены - данные объявляются согласно правилам объявления переменных и могут иметь любой тип, включая тип класса и указателя на тип класса. Функции- члены в спецификации представлены прототипами.
Спецификация класса, как правило, размещается в отдельном заголовочном файле с расширением «.h» и имеет следующий формат :
class имья_класy {
private:
/ / Закрытые члены класса protected:
/ / Защищенные члены класса
public:
/ / Открытые члены класса
};
Объявление класса начинается с ключевого слова class, за которым следует имя класса, и заканчивается точкой с запятой. Внутри фигурных скобок может находиться любое количество секций со спецификаторами доступа, причем спецификаторы могут повторяться (листинг 14.1).
Примечание
Если после открывающей фигурной скобки не стоит никакой спецификатор доступа, члены класса по умолчанию становятся private (закрытые).
Листинг программы - Пример объявления класса
/ / Book.h - спецификация класса Своок
# Pragma once
class СВоок {
private :
char m_author [ 50 ]; / / автор
char * m_pTitle; / / указатель на название
Int m_year; / / год издания
public :
/ / Методы установки значений
void setAuthor (const char *);
void setTitle (const char *);
void setYear (const int);
/ / Методы возврата значений
char * getAuthor (void);
char * getTitle (void);
int getYear (void);
};
Файл спецификации Book.h содержит объявления типа класса CBоок. Чтобы компилятор включал объявления типа только один раз при трансляции программы, используется директива препроцессора # pragma once.
В классе объявлены закрытые данные с типом массива m_author, указателя на символьный тип m_pTitle и целого m_уеаг, описывающие автора, название и год издания, соответственно. Тип своок сообщает компилятору, что для создания объекта типа CBоок нужно 50 байт для хранения автора, 4 байта для адреса, по которому будет записано название книги, и 4 байта для хранения года издания.
Чтобы можно было изменять значения данных у объектов класса и получать эти значения в программе, в классе объявлены открытые методы. Функции - члены с типом возвращаемого значения void имеют параметр, тип которого соответствует типу данного. Методы для возвращения значений не нуждаются в параметрах, поскольку переменные, значения которых они возвращают, известные класса. Тип каждого метода обусловлен типом возвращаемой (возвращаемой переменной) переменной.
Реализация класса
Определение объявленных в спецификации класса методов располагается в отдельном файле с расширением .срр, называемом файлом реализации класса.
Когда файлы спецификации и реализации класса находятся в разных файлах, заголовок функции - члена должен включать область видимости согласно формату:
тип_функции - члена имя_класса :: имя_функции - члена (список параметров)
Оператор разрешения области видимости :: используется в заголовке с той целью, чтобы все объявленные внутри класса идентификаторы обрабатывались внутри их собственного пространства имен, а также во избежание неоднозначности использование имен. Запись тела метода ничем не отличается от записи в обычной функции. В файл реализации класса следует включить файл спецификации класса, а также необходимые при определении функций заголовки стандартных библиотек (листинг 14.2).
Листинг 14.2. Пример реализации класса
/ / Воок.срр - реализация класса СВооk
# include " Book.h "
# include <string>
/ / Установить автора
void СВоок :: setAuthor (const char * author) {
strncpy_s < m_author, 50, author, 49);
if (strlen (author) > 49) m_author [ 49 ] = '\ 0';
}
/ / Установить название
void СВоок :: setTitle (const char * title) {
delete [] m_pTitle;
m_pTitle = new char [ strlen (title) 1];
strcpy_s (m_pTitle, strlen (title) 1, title);
}
/ / Установить год издания
void СВоок :: setYear (const int year)
{ M_уеаr = year;}
/ / Вернуть автора
char * СВоок :: getAuthor (void)
{
return m_author;
}
/ / Вернуть название
char * СВоок :: getTitle (void)
{
return m_pTitle;
}
/ / Вернуть год издания
int СВоок :: getYear (void)
{
return m_year;
}
Методы, показанные в листинге 14.2, не требуют особых комментариев. Следует обратить внимание на определение методов для определения значения автора и значение названия книги.
В методе setAuthor () в переменную m_author можно скопировать только 49 байтов из параметра author. В случае превышения этого значения остаток строки author теряется, и в последний байт массива m_author записывается нулевой байт.
В методе setTitle () данное m_pTitle является указателем, поэтому сначала необходимо освободить память, занимаемую существующим значением на ¬ звание книги, выделить достаточный для размещения нового названия книги блок памяти и только потом копировать значение параметра title. При выделении памяти до длины строки title добавляется 1 байт для записи нулевого байта.
Объявления объекта класса
Объявления объекта класса (object definition) не стоит путать с объявлением класса. Важно понимать, что класс не содержит никаких значений данных, а лишь описывает общую структуру и поведение объектов, являясь как бы трафаретом для их создания.
Описание объекта задает его тип (имя класса) и, возможно, необходимые для инициализации членов - данных значения. При объявлении объекта компилятор получает указание на создание переменной класса на основании заданного типа.
Когда объект объявляется, то согласно описанию класса для объекта происходит выделение оперативной памяти, а также при указании значений данных осуществляется инициализация членов - данных указанными значениями. Всю эту работу делает специальный метод класса, называемый конструктором. Конструкторы рассматриваются в книге в отдельном разделе с одноименным названием.
Основными форматами объявления объекта класса являются следующие:
имя_класса имя_объекта;
имя_класса имя_объекта (список параметров); имя_класса имя_объекта (имя_объекта_копирования);
Листинг 14.3. Пример объявления объектов класса
CBook book, аВооk [ 100 ];
СВоок obj (" Carrol L. ", " Alice in Wonderland ", 2002);
CBook copy (obj);
В листинге 14.3 использованы все три формата для объявления объектов типа класса CBоок. Согласно первому, объявляется объект book и массив из 100 объектов аВоок. По второму формату объявленный объект obj, и по третьему - объект мусору.
При создании очередного экземпляра класса часто возникает необходимость начальной инициализации некоторых переменных. Для этой цели и служит конструктор. При создании экземпляра класса автоматически вызывается конструктор. Имя функции конструктора всегда совпадает с именем класса. Ниже представлены код объявления и реализации конструктора класса CMyClass.
Бывают так же и такие ситуации, когда для правильной начальной инициализации необходима некоторая входная информация. Для этой цели служат конструкторы с параметрами. Параметров в конструкторе может быть сколько угодно. Ниже представлен пример использования конструктора с одним целочисленным параметром для инициализации переменной класса.
Надо сказать, что конструкторов в классе может быть несколько, и использовать можно тот, который наиболее подходит для той или иной ситуации. Приведу пример:
Деструкторы
Деструкторы - функции, которые выполняют где инициализацию элементов класса. Зачем это нужно? Приведу пример. Представьте себе, что в классе есть несколько инициализованних указателей. Если удалить экземпляр класса просто так, то возможна утечка памяти, то есть элементы класса в " куче " так и будут висеть в ней до конца выполнения программы. Можно, конечно, исхитриться и каждый раз писать удаления элементов из " кучи" вручную, но это долго, неудобно, а самое главное не нужно. Достаточно прописать строки удаления в деструкции, который будет вызываться при удалении каждого экземпляра класса. Деструктор также, как и конструктор носит имя класса, но перед ним следует знак " ~ ". Приведу пример деструктора класса CMyClass :
Последнее, что нужно сказать о деструкции, это то, что в одном классе не может быть более одного деструктора. Стоит напомниты еще о том, что не бывает деструкторов с параметрами.
