Class CPoint

{

public: // интерфейс класса

CPoint(int x, int y);

int GetX();

int GetY();

void Show();

void Hide();

bool IsVisible();

void MoveTo(int x, int y);

private: // реализация класса

int __x, __y;

bool __visible;

};

Ниже, для примера, представлены определения функций CPoint::IsVisible и CPoint::MoveTo (определения функций отображения и стирания точки намеренно не даются, так как сам процесс вывода точки сильно зависит от контекста, в котором работает объект).

 

inline bool CPoint::IsVisible()

{

return __visible;

};

 

void CPoint::MoveTo(int x, int y)

{

Hide();

__x = x;

__y = y;

Show();

};

 

Каждая точка – объект класса CPoint – имеет 3 свойства: координату по оси X (компонент __x), координату по оси Y (компонент __y) и признак видимости (__visible). В верхней части определения записаны декларации функций, которые характеризуют возможности наших точек. Например, функции GetX и GetY возвращают соответствующие текущие координаты точки, а функция MoveTo передвигает точку в нужное место на экране.

Определение класса CPoint начинается служебным словом class. Слово class делает все компоненты класса недоступными извне, о чем уже говорилось ранее. Поскольку такой «полностью закрытый» класс вряд ли имеет ценность (получается точка, которая «ничего не умеет»), часть его компонент все же сделана доступной. Для этого было использовано ключевое слово public. Все, что следует за словом public до конца определения класса или до другого слова управления доступностью, считается «видимой» частью класса и называется его интерфейсом. Все, что следует за словом private, вновь недоступно извне. Это реализация класса. В определении класса есть декларация функции, имя которой совпадает с именем класса. Это специальная функция, которая служит для инициализации объектов класса при их создании. Называется она конструктором (более подробно конструкторы будут рассмотрены ниже).

Вообще, в С++ программист имеет три способа управлять доступностью компонент класса и, соответственно, влиять на уровень инкапсуляции. Первый предусматривает использование спецификаторов struct, class и union при определении класса, о которых мы уже говорили выше. В зависимости от используемого спецификатора меняется доступность компонент класса. Если класс определяется как struct, то все его компоненты считаются общедоступными (уровень инкапсуляции минимальный) и к ним можно обращаться извне. Если класс определен с ключом class (как класс CPoint выше), то все его компоненты скрыты (степень инкапсуляции максимальна). При использовании union уровень инкапсуляции такой же, как и у struct, но, в отличие от struct, только один компонент данных активен в каждый момент времени (компоненты совмещены в одной и той же области памяти).

Второй способ отличается тем, что действует не интегрально, на весь класс, а выборочно на требуемые компоненты. Он использует три спецификатора доступности компонент: public, protected и private. Эти спецификаторы могут появляться в любом месте определения класса произвольное число раз в любых сочетаниях. После спецификатора ставится двоеточие. Спецификатор public делает компоненты доступными извне, private, напротив, скрывает компоненты, а protected открывает компоненты только для наследников текущего класса (данный спецификатор подробно будет рассмотрен далее при изучении механизма наследования). Действие спецификатора распространяется от следующего за ним символа двоеточия до следующего спецификатора или до конца определения класса, если данный спецификатор последний.

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

В качестве примеров ниже даны определения классов CDate (представление календарных дат) и mod24 (число по модулю 24), где использованы разные ключи и спецификаторы.