Материал: 3574

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Лабораторная работа №2. Объявление и описание классов

1.Цель лабораторной работы.

Цель лабораторной работы - получить практические навыки реализации классов на С++.

2.Теоретический материал для домашнего изучения.

Класс — это тип данных, определяемый пользователем. То, что в

C++Builder имеется множество предопределенных классов, не противоречит этому определению — ведь разработчики C++Builder тоже пользователи С++. Понятия класса, структуры и объединения в С++

довольно близки друг к другу.

Класс должен быть объявлен до того, как будет объявлена хотя бы одна переменная этого класса. Т.е. класс не может объявляться внутри объявления переменной. Синтаксис объявления класса следующий:

class <имя класса> : <список классов - родителей>

{

public: // доступно всем

<данные, методы, свойства, события>

__published // видны в Инспекторе Объекта и изменяемы

<данные, свойства> protected: // доступно только потомкам

<данные, методы, свойства, события> private: // доступно только в классе

<данные, методы, свойства, события>

} <список переменных>;

Например:

class MyClass : public Classl, Class2

{

public: MyClass(int = 0);

void SetA(int); int GetA(void); private: int FA; double В, C; protected:

int F(int); };

Имя класса может быть любым допустимым идентификатором.

Идентификаторы классов, наследующих классам библиотеки компонентов

C++Builder, принято начинать с символа «Т».

Класс может наследовать поля (они называются данные-элементы),

методы (они называются функции-элементы), свойства, события от других классов — своих предков, может отменять какие-то из этих элементов класса или вводить новые. Если предусматриваются такие классы-предки,

то в объявлении класса после его имени ставится двоеточие и затем дается список родителей. В приведенном выше примере предусмотрено множественное наследование классам Class1 и CIass2. Если среди классов-

предков встречаются классы библиотеки компонентов C++Builder или классы, наследующие им, то множественное наследование запрещено.

Бели объявляемый класс не имеет предшественников, то список классов-родителей вместе с предшествующим двоеточием опускается.

Например:

class MyClass1

{

};

Доступ к объявляемым элементам класса определяется тем, в каком разделе они объявлены. Раздел public (открытый) предназначен для объявлений, которые доступны для внешнего использования. Это открытый интерфейс класса. Раздел published (публикуемый) содержит

открытые свойства, которые появляются в процессе проектирования на странице свойств Инспектора Объектов и которые, следовательно,

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

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

В приведенном выше примере черѐз объект данного класса можно получить доступ только к функциям MyClass, SetA и GfetA. Поля FA, В, С

и функция F — закрытые элементы. Это вспомогательные данные и функция, которые используют в своей работе открытые функции.

Открытая функция MyClass с именем, совпадающим с именем класса, это так называемый конструктор класса, который должен инициализировать данные в момент создания объекта класса. Присутствие конструктора в объявлении класса не обязательно. При отсутствии конструктора пользователь должен сам позаботиться о задании начальных значений дан-

ным-элементам класса.

Перед именами классов-родителей в объявлении класса также может указываться спецификатор доступа (в примере public). Смысл этого спецификатора тот же, что и для элементов класса: при наследовании public (открытом наследовании) можно обращаться через объект данного класса к методам и свойствам классов-предков, при наследовании private

подобное обращение невозможно.

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

в описание до первого спецификатора доступа, считается защищенным.

Аналогично, если не указан спецификатор перед списком классов-

родителей, предполагается защищенное наследование.

Объявления данных-элементов (полей) выглядят так же, как объявления переменных или объявления полей в структурах:

<тип> <имена полой>;

В объявлении класса поля запрещается инициализировать. Для инициализации данных служат конструкторы.

Объявления функций-элементов в простейшем случае не отличаются от обычных объявлений функций.

После того, как объявлен класс, можно создавать объекты этого класса. Если ваш класс не наследует классам библиотеки компонентов

C++Builder, то объект класса создается как любая переменная другого типа простым объявлением. Например, оператор:

MyClass МС, МС10[10], *Pmc;

создает объект МС объявленного выше класса MyClass, массив МС10 из десяти объектов данного класса и указатель Pmc на объект этого класса.

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

MyClass МС(3);

не только создает объект МС, но и задает его полю FA значение 3,

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

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

class MyClass : public Classl, Class2

{

} МС, MC10[10], *Pmc;

Если создается динамически размещаемый объект класса, то это делается операцией new. Например:

MyClass *РМС = new MyClass;

или

MyClass *РМС1 = new MyClass(3);

Эти операторы создают где-то в динамически распределяемой области памяти сами объекты и создают указатели на них — переменные РМС и РМС1.

Создание объектов класса простым объявлением переменных возможно только в случае, если среди предков вашего класса нет классов библиотеки компонентов С++Builder. Если же такие предки есть, то создание указателя на объект этого класса возможно только операцией new. Например, если класс объявлен так:

class MyClass2 : public TObject

{

};

то создание указателя на объект этого класса может осуществляться оператором:

MyClass2 *Р2 = new MyClass2;

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

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