Информационно-безопасные системы. Анализ проблемы: Учебное пособие, страница 18

а.х =- 5000;          // Эта попытка изменить значение координаты х

// цели а является ошибкой, которую обнаружит

// компилятор.

};

В ООП принято говорить: "Объекту а посылается сообщение в виде имени метода in()" вместо: "Функция in() вызывается ...". Таким образом, объекту сообщается, что именно надо сделать. В нашем случае сообщается, что к объекту а должен быть применен метод in() - ввод защищенных данных. Метод out(), будучи послан объектам а и b, позволяет вывести на экран значения их координат. Отметим, что последний оператор: а.х = 5000; был бы вполне корректным, если бы координаты х, у, z были объявлены в секции public, а не в секции protected.

Таким образом, на этапе описания "правил игры" с объектами какого-то класса мы можем управлять типом доступа к данным. Изменить значение координаты можно только с помощью метода класса. Добраться до нее с помощью закладки достаточно сложно, так как надо знать адрес памяти, который компоновщик отвел для искомой переменной. В то же время существует возможность разрешить некоторым внешним функциям доступ к внутренним данным класса. Эта возможность полностью контролируется в модуле описаний класса, где должно быть явно указано, что функция с таким-то именем является "другом" класса, а следовательно, в ней разрешено модифицировать private и protected данные класса.

Пример 5.3

class Coord

{

friend float dist (Coord);

// В классе явно указано, что внешняя функция dist(),

// которая возвращает значение типа float и на вход

// которой следует подать объект типа Coord является

// friend-функцией класса.

};

float dist (Coord a)           // Тело внешней функции dist()

{

float d;                 // Расстояние до начала координат

d = a.x * а.х + а.у * а.у + a.z * a.z;         // Квадрат расстояния

d - pow (d, 1/2);                                // Возведение в степень 1/2

return d;                                           // Возврат результата

};

Рассмотренное средство доступа к внутренним данным класса с помощью friend функций обходит ограничения, накладываемые принципом скрытия данных, однако) в этом случае контроль за списком friend-конструкций осуществляется просто. В нашем случае, конечно, не было необходимости вводить friend-функцию. Это было сделано с целью иллюстрации механизма доступа. Вычисление расстояния до цели следовало оформить в виде метода класса. Так же, как это было сделано для функции in() и out();

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

Определение 5.8: Конструктором называется метод класса, имеющий то ж имя,   что и сам класс и служащий для автоматической инициализации   объектов данного класса в точке их объявления.

Определение 5.9: Деструктором называется метод класса, который обеспечивает  автоматическое освобождение памяти, занимаемой объектом при  завершении работы блока, в котором этот объект определен.

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

Класс может иметь несколько конструкторов, отличающихся типом параметров. Дополним класс Coord двумя конструкторами и деструктором. Для этого в секции public следует добавить следующие описания:

Пример 5.4

public:

Coord ()               // Конструктор без параметров

{

type[0] - '\0';   // Пустая строка

х = у = z = 0;  // Обнуляет координаты цели

};

// Конструктор с параметрами

Coord (char *t, float xx, float yy, float zz)

{

// Копирует строку *t в строку type[20]

strcpy (type, t);

// Инициализирует данные входными параметрами

х=xx; у=yy;z = zz;

);

~Coord ()                   // Деструктор

{};                             // Пустое тело деструктора