Ключевые слова: конструктор, деструктор, копирующий кон-
структор, передача аргументов по значению, освобождение памяти, ини-
циализация объекта, new, delete.
Цель: познакомится с написанием конструкторов, копирующего
конструктора, деструкторов классов при работе с динамической обла-
стью памяти, использованием операций new и delete и возможностью
инициализации объектов.
Иногда скрытые атрибуты класса требуется открыть для ограни-
ченного доступа извне, что достигается использованием дружественных
функций и дружественных классов.
Дружественные функции применяются для доступа к скрытым
атрибутам класса и представляют собой альтернативу методам. Методы,
как правило, связаны с атрибутами объекта.
Правила описания и особенности дружественных функций:
Дружественная функция объявляется внутри класса, к элементам
которого ей нужен доступ, с ключевым словом friend. В качестве
параметра ей должен передаваться объект или ссылка на объект
класса, поскольку указатель this данной функции не передается.
Дружественная функция может быть обычной функцией или методом
другого ранее определенного класса. На нее не распространяется дей-
ствие спецификаторов доступа, место размещения ее объявления
в классе безразлично.
Одна функция может быть дружественной сразу нескольким классам.
Допустим, мы хотим ограничить возможности по изменению состо-
яния некоторых объектов предметной области таким образом, чтобы
делать это могла только специальная функция. Это может делаться исходя
из того, что реализация последней должна соответствовать определенному
набору требований разработчика по организации взаимодействия между
пользователем и объектами бизнеслогики системы.
Такой подход может быть актуальным, когда предполагается воз-
можность создания новой надстройки к базовой архитектуре объектов
системы и стоит задача защититься от некорректных изменений объектов
предметной области, которые новый модуль предполагает получать
из общей базы данных.
34
С этой целью мы можем объявить методы-модификаторы класса
Person как закрытые (или защищенные, если в будущем предполагается
наследование), а необходимую для обеспечения интерфейса с пользова-
телем функцию set_name() как дружественную:
class Person
{
friend void set_name(Person & argname);
private:
// ...
}
Если все методы какого-либо класса должны иметь доступ к скры-
тым атрибутам другого, весь класс объявляется дружественным с помощью
ключевого слова friend. Так, мы можем объявить класс Dialog в качестве
дружественного для Person, если хотим обеспечить изменение внутреннего
состояния объектов этого класса средствами спроектированного диалога.
class Person
{
friend class Dialog;
// ...
}
Естественно, перечень друзей не должен ограничиваться одним
классом или функцией, а определяется лишь соображениями разумной
достаточности. Использования дружественных функций нужно по возмож-
ности избегать, поскольку они нарушают принцип инкапсуляции и, таким
образом, затрудняют отладку и модификацию программы.
Достарыңызбен бөлісу: |