
Объектно-ориентированное
ПРОГРАММИРОВАНИЕ С++
1. Классы
Класс С++ представляет собой сложный тип данных, похожий на стандартную структуру в С.
Ключевое слово: class
В отличие от структуры, класс С++ определяет не только набор элементов данных, но также функции, которые оперируют этими элементами данных.
Данные, определенные внутри класса, называются элементами данных класса, а функции, определенные внутри класса, называются методами данного класса.
Пример:
class CRectangle
{ int Left; // элементы данных класса
int Top; // элементы данных класса
int Right; // элементы данных класса
int Bottom; // элементы данных класса
void Draw() // метод – компонентная
// функция
{ Line(Left, Top, Right, Top);
Line(Right, Top, Right, Bottom);
Line(Right, Bottom, Left, Bottom);
Line(Left, Bottom, Left, Top);
}
}
Метод класса может ссылаться непосредственно на элементы данных без специального синтаксиса.
Создание экземпляра класса:
Определение класса, как и определение структуры, не резервирует память. Память выделяется только при непосредственном объявлении объекта.
Пример: CRectangle Rect;
Rect – экземпляр класса или объект класса CRectangle.
Rect занимает соответствующий блок памяти и может быть использован для хранения данных и выполнения операций над данными. Время жизни объекта определяется его областью видимости.
Создать экземпляр класса можно и динамически с помощью оператора new:
CRectangle *PRect=new CRectangle;
Удаление:
delete PRect;
Доступ к компонентам класса:
По умолчанию все компоненты класса определены как личные (private). Это означает, что они могут использоваться только внутри методов данного класса. Так, для функции Draw() разрешен доступ к элементам данных Top, Left, Right, Bottom, так как Draw() – метод класса CRectangle.
Однако для других частей программы (например, функции main()) не разрешен доступ к элементам данных и запрещен вызов функции Draw().
Чтобы сделать компоненты доступными для всех функций в программе, используется спецификация доступа public.
Спецификатор доступа прилагается ко всем компонентам, которые стоят после него (пока не встретится другой спецификатор доступа).
class CRectangle
{ public:
Int Left; // элементы данных класса
int Top; // элементы данных класса
int Right; // элементы данных класса
int Bottom; // элементы данных класса
void Draw() // метод – компонентная
// функция
{ Line(Left, Top, Right, Top);
Line(Right, Top, Right, Bottom);
Line(Right, Bottom, Left, Bottom);
Line(Left, Bottom, Left, Top);
}
}
Когда все компоненты CRectangle общедоступны, к ним возможен доступ с использованием оператора точка (.):
Пример:
CRectangle Rect;
Rect.Left=5;
Rect.Top=10;
Rect.Right=100;
Rect.Bottom=150;
Rect.Draw();
С другой стороны, можно динамически создавать экземпляр класса оператором new и затем использовать указатель на объект для доступа к элементам данных.
Пример:
CRectangle *PRect=new CRectangle;
Rect->Left=5;
Rect->Top=10;
Rect->Right=100;
Rect->Bottom=150;
Rect->Draw();
Инкапсуляция:
Согласно принципу инкапсуляции, внутренние структуры данных, используемые в реализации класса, не должны быть доступны непосредственно пользователю класса.
Текущий вариант класса CRectangle явно нарушает этот принцип. Следуя принципу инкапсуляции, в классе CRectangle должен быть общий доступ к методу Draw() и запрет на доступ к элементам данных класса.
Пример:
class CRectangle
{ private: