Генерация псевдослучайных чисел
Глава 2
Глава 2
Объявление класса
Классы с 188
Классы и шаблоны классов - это, пожалуй, самое главное в C++. Все, связан-
ное с этими понятиями, в рамках данной книги рассмотреть невозможно. В реали-
зации классов и шаблонов есть масса тонкостей, на которых я останавливаться не
буду. Но все, необходимое для использования классов и их шаблонов, а также для
разработки достаточно сложных собственных классов и шаблонов, будет рассмот-
рено.
Класс — это тип данных, определяемый пользователем. То, что в стандартной
библиотеке C++ и в C++Builder имеется множество предопределенных классов, не
противоречит этому определению — ведь разработчики C++Builder тоже пользова-
тели C++. Понятия класса, структуры (см.-разд. 2.12) и объединения (см. разд.
2.13) в C++ довольно близки друг к другу. Поэтому почти все, что будет далее гово-
риться о классах, применимо также к структурам и объединениям.
Класс должен быть объявлен до того, как будет объявлена хотя бы одна пере-
менная этого класса. Т.е. класс не может объявляться внутри объявления перемен-
ной.
Синтаксис объявления класса следующий:
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);
};
Имя класса может быть любым допустимым идентификатором. Идентифика-
торы классов, наследующих классам библиотеки компонентов С+Ч-Builder, приня-
то начинать с символа "Т".
Класс может наследовать поля (они называются данные-элементы), методы
(они называются функции-элементы), свойства, события от других классов — сво-
их предков, может отменять какие-то из этих элементов класса или вводить но-
вые. Если предусматриваются такие классы-предки, то в объявлении класса после
его имени ставится двоеточие и затем дается список родителей. В приведенном
выше примере предусмотрено множественное наследование классам Classl и
CIass2.Если среди классов-предков встречаются классы библиотеки компонентов
C++Builder или классы, наследующие им, то множественное наследование запре-
щено.
Если объявляемый класс не имеет предшественников, то список классов-роди-
телей вместе с предшествующим двоеточием опускается. Например:
class MyClassl
Доступ к объявляемым элементам класса определяется тем, в каком разделе
они объявлены. Раздел public(открытый) предназначен для объявлений, которые
доступны для внешнего использования. Это открытый интерфейс класса. Раздел
published(публикуемый) содержит открытые свойства, которые появляются
в процессе проектирования на странице свойств Инспектора Объектов и которые,
следовательно, пользователь может устанавливать в процессе проектирования.
Раздел private(закрытый) содержит объявления полей и функций, используемых
только внутри данного класса. Раздел protected(защищенный) содержит объявле-
ния, доступные только для потомков объявляемого класса. Как и в случае закры-
тых элементов, можно скрыть детали реализации защищенных элементов от ко-
нечного пользователя. Однако в отличие от закрытых, защищенные элементы ос-
таются доступны для программистов, которые захотят производить от этого класса
производные классы, причем не требуется, чтобы производные классы объявля-
лись в этом же модуле.
В приведенном выше примере через объект данного класса можно получить
доступ только к функциям MyClass, SetA и GetA.Поля FA, В, С и функция F -
закрытые элементы. Это вспомогательные данные и функция, которые использу-
ют в своей работе открытые функции. Открытая функция MyClassс именем, сов-
падающим с именем класса, это так называемый конструктор класса, который
должен инициализировать данные в момент создания объекта класса. Присутст-
вие конструктора в объявлении класса не обязательно. При отсутствии конструк-
тора пользователь должен сам позаботиться о задании начальных значений дан-
ным — элементам класса.
Типы данных в языке C++ 187
Перед именами классов-родителей в объявлении класса также может указы-
ваться спецификатор доступа (в примере public).Смысл этого спецификатора тот
же, что и для элементов класса: при наследовании public(открытом наследовании)
можно обращаться через объект данного класса к методам и свойствам клас-
сов-предков, при наследовании privateподобное обращение невозможно. Подроб-
нее этот вопрос рассмотрен в разд. 2.14.5.
По умолчанию в классах (в отличие от структур) предполагается специфика-
тор private.Поэтому можно включать в объявление класса данные и функции, не
указывая спецификатора доступа. Все, что включено в описание до первого специ-
фикатора доступа, считается защищенным. Аналогично, если не указан специфи-
катор перед списком классов-родителей, предполагается защищенное наследова-
ние.
Объявления данных-элементов (полей) выглядят так же, как объявления пе-
ременных или объявления полей в структурах:
<тип> <имена полей>;
В объявлении класса поля запрещается инициализировать. Для инициализа-
ции данных служат конструкторы, о которых упоминалось выше и которые рас-
сматриваются подробно в разд. 2.14.4.
Объявления функций-элементов в простейшем случае не отличаются от обыч-
ных объявлений функций (см. гл. 1 разд. 1.7.1).
После того, как объявлен класс, можно создавать объекты этого класса. Если
ваш класс не наследует классам библиотеки компонентов C-f+Builder, то объект
класса создается как любая переменная другого типа простым объявлением. На-
пример, оператор
MyClass MC, MC10[10], *Ртс;
создает объект МС объявленного выше класса MyClass, массив МС10 из десяти
объектов данного класса и указатель Рте на объект этого класса.
В момент создания объекта класса, имеющего конструктор, можно инициали-
зировать его данные, перечисляя в скобках после имени объекта значения данных.
Например, оператор
MyClass MC(3) ;
не только создает объект МС, но и задает его полю FA значение 3. Если этого не
сделать, то в момент создания объекта поле получит значение по умолчанию, ука-
занное в содержащемся в объявлении класса прототипе конструктора.
Создание переменных, использующих класс, можно совместить с объявлени-
ем самого класса, размещая их список между закрывающей класс фигурной скоб-
кой и завершающей точкой с запятой. Например:
class MyClass : public Classl, Class2
{
} МС, МС10[10], *Pmc;
Если создается динамически размещаемый объект класса (см. гл. 1, разд. 1.11),
то это делается операцией new. Например:
MyClass *PMC = new MyClass;
ИЛИ
MyClass *РМС1 = new MyClass( 3 ) ;
Эти операторы создают где-то в динамически распределяемой области памяти
сами объекты и создают указатели на них — переменные РМС и РМС1.
Создание объектов класса простым объявлением переменных возможно толь-
ко в случае, если среди предков вашего класса нет классов библиотеки компонен-
тов C++Builder. Если же такие предки есть, то создание указателя на объект этого
класса возможно только операцией new.Например, если класс объявлен так:
class MyClass2 : public TObject
то создание указателя на объект этого класса может осуществляться оператором
MyClass2 *Р2 = new MyClass2;