
- •3.1. Определение класса
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.2. Создание экземпляра класса
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.3. Доступ к членам класса
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.4. Инкапсуляция
- •Int Left;
- •Int Right;
- •Int Bottom;
- •Int Left;
- •Int Right;
- •Int Bottom;
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.5. Конструкторы и деструкторы
- •3.5.1. Конструкторы
- •Int Left;
- •Int Right;
- •Int Bottom;
- •Int Left;
- •Int Right;
- •Int Bottom;
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.5.2. Деструкторы
- •3.5.3. Когда вызываются конструкторы и деструкторы
- •3.6. Встроенные функции-члены
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.7. Организация исходных файлов
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.8. Указатель this
- •3.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: