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

Int Left;

int Top;

Int Right;

Int Bottom;

public:

void Draw (void)

{

Line (Left, Top, Right, Top);

Line (Right, Top, Right, Bottom);

Line (Right, Bottom, Left, Bottom);

Line (Left, Bottom, Left, Top);

}

void GetCoord (int L, int Т, int R, int B)

{

*L = Left;

*T = Top;

*R = Right;

*B = Bottom;

}

void SetCoord (int L, int Т, int R, int B)

{

L = _min (_max (0,L), 80);

Т = _min (_max (0,T), 25);

R = _min (_max (0,R), 80);

В = _min (_max (0,B), 25);

R = _max (R,L) ;

В = _max (B,T);

Left = L; Top = T; Right = R; Bottom = B;

}

}

Теперь, с помощью функций-членов SetCoord и GetCoord класс Rectangle предоставляет доступ к закрытым переменным (согласно принципам инкапсуляции) только посредством четко определенного интерфейса, контролирующего корректность новых присвоенных значений и, при необходимости, корректирующего эти значения.

Преимущества инкапсуляции

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

Другое преимущество управления доступом к внутренним структурам данных заключается в том, что автор класса может свободно изменить способ представления этих данных, не изменяя другие части программы, использующие класс (до тех пор, пока сохраняется интерфейс вызовов общедоступных функций-членов). Простой пример: автор класса CRectan-gle решил хранить координаты левого верхнего угла прямоугольника вместе с его шириной и высотой вместо координат правого нижнего угла. В этом случае переменные-члены могут быть определены следующим образом.

private:

Int Left;

int Top;

Int Right;

Int Bottom;

Пока интерфейс вызова функций SetCoord и GetCoord остается прежним, внутренние изменения не влияют на другие части программы или любые другие программы, использующие класс CRectangle. (Конечно, эти две функции пришлось бы изменить так, чтобы выполнять преобразования между значениями координат и значениями ширины и высоты.) Инкапсуляция исключает зависимость пользователя класса от специфического внутреннего представления данных.

3.5. Конструкторы и деструкторы

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

3.5.1. Конструкторы

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

Конструктор имеет такое же имя, как и класс. При определении конструктора нельзя указывать тип возвращаемого значения, даже void (конструктор никогда не возвращает значение). Однако он может принять любое число аргументов (включая нулевое). Например, следующий вариант класса CRectangle содержит конструктор, принимающий четыре параметра для инициализации переменных-членов. (Вспомните: функция-член SetCoord проверяет корректность значений аргументов и присваивает значения параметров закрытым переменным-членам, хранящим координаты прямоугольника.)

class CRectangle ,

{

private: