Генерация псевдослучайных чисел

Глава 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;