Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++ глава 3.doc
Скачиваний:
5
Добавлен:
05.11.2018
Размер:
187.9 Кб
Скачать

3. ОПРЕДЕЛЕНИЕ КЛАССОВ C++

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

3.1. Определение класса

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

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

struct Rectangle

{

int Left;

int Top;

int Right;

int Bottom;

};

Далее можно определить функцию рисования прямоугольника.

void DrawRectangle (struct Rectangle *Rect)

{

Line (Rect->Left, Rect->Top, Rect->Right, Rect->Top);

Line (Rect->Right, Rect->Top, Rect->Right, Rect->Bottom);

Line (Rect->Right, Rect->Bottom, Rect->Left, Rect->Bottom);

Line (Rect->Left, Rect->Bottom, Rect->Left, Rect->Top);

}

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

Наконец, чтобы задать прямоугольник в определенном месте, нужно определить и инициализировать переменную типа Rectangle, а затем передать ее в функцию DrawRectangle.

struct Rectangle SRect = (25, 25, 100, 100);

DrawRectangle (SRect);

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

class CRectangle

{

Int Left;

int Top;

Int Right;

Int Bottom;

void Draw (void)

{

Line (Left, Top, Right, Top);

Line (Right, Top, Right, Bottom);

Line (Right, Bottom, Left, Bottom);

Line (Left, Bottom, Left, Top);

}

};

Компоненты данных, определенные внутри класса, называются переменными-членами класса (иногда их называют также полями данных). Функции, определенные внутри класса, называются функциями-членами или методами класса. В этом примере переменные-члены – Left, Top, Right и Bottom, а функция-член – Draw. Обратите внимание: функция-член может содержать ссылку на любую переменную класса, не используя при этом специальный синтаксис.

3.2. Создание экземпляра класса

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

struct Rectangle

{

Int Left;

int Top;

Int Right;

Int Bottom;

};

Чтобы зарезервировать память и создать переменную, нужно задать определение

struct Rectangle Rect;

Аналогично определяется класс, например CRectangle, показанный в предыдущем параграфе. При этом компилятору предоставляется проект класса, но в действительности место в памяти не резервируется. Как и структура, такая переменная-член должна определяться выражением типа

CRectangle Rect;

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

Примечание

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

Экземпляр класса можно создать, используя имеющийся в языке C++ оператор new, например:

CRectangle *PRect = new CRectangle;

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

delete CRectangle;

Можно создать произвольное число экземпляров данного класса.

Совет

При создании экземпляра класса перед именем класса можно не указывать слово class. В C++ определение класса создает новый тип данных, на который можно сослаться, используя одно лишь имя класса.