Cтраница 3
![]() |
Определенные пользователем операции поместить в поток и взять из потока. [31] |
Заметим, что функции operator и operator объявлены в class PhoneNumber не как функции-элементы, а как дружественные функции. Эти операции не могут быть элементами, так как объект класса PhoneNumber появляется в каждом случае как правый операнд операции; а для перегруженной операции, записанной как функция-элемент, операнд класса должен появляться слева. Перегруженные операции поместить в поток и взять из потока должны объявляться как дружественные, если они должны иметь прямой доступ к закрытым элементам класса по соображениям производительности. [32]
Создайте определенный пользователем класс Point, который содержит закрытые данные-элементы xCoordinate и yCoordinate и объявляет перегруженные функции-операции взять из потока и поместить в поток как дружественные функции класса. [33]
Создайте определенный пользователем класс Complex, который содержит закрытые данные-элементы real и imaginary и объявляет перегруженные функции-операции взять из потока и поместить в поток как дружественные функции класса. [34]
При перегрузке унарных операций предпочтительнее создавать фукции-операции, являющиеся элементами класса, вместо дружественных функций, не являющихся элементами. Дружественных функций и дружественных классов лучше избегать до тех пор, пока они не станут абсолютно необходимыми. Использование друзей нарушает инкапсуляцию класса. [35]
При перегрузке унарных операций предпочтительнее создавать фук-ции-операции, являющиеся элементами класса, вместо дружественных функций, не являющихся элементами. Дружественных функций и дружественных классов лучше избегать до тех пор, пока они не станут абсолютно необходимыми. Использование друзей нарушает инкапсуляцию класса. [36]
При перегрузке оператора необходимо использовать функции-члены класса. Нельзя использовать дружественные функции, которые не являются членами класса. [37]
Дружественные функции используются для повышения производительности. Приведем формальный пример, показывающий, как работает дружественная функция. Далее в этой книге дружественные функции применяются для перегрузки операций, используемых классами, и для создания классов итераторов. Объекты классов контейнеров способны хранить множество элементов в форме, подобной массиву. [38]
![]() |
Друзья могут иметь доступ к закрытым элементам класса ( часть 2 из 2.| Функции, не яфляющиеся друзьями или элементами, не могут иметь доступ к закрытым элементам класса ( часть 1 из 2. [39] |
Программа на рис. 7.6 демонстрирует сообщения, вырабатываемые компилятором, когда для изменения закрытого элемента данных х вызывается функция cannotSetX, не являющаяся дружественной. Рисунки 7.5 и 7.6 предназначены для ознакомления с формальным механизмом использования дружественных функций; практические примеры использования дружественных функций появятся в последующих главах. [40]
Операция преобразования ( называемая также операцией приведения) может быть использована для преобразования объекта одного класса в объект другого класса или в объект встроенного типа. Такая операция преобразования должна быть нестатической функцией-элементом; операция преобразования этого вида не может быть дружественной функцией. [41]
Программа на рис. 7.6 демонстрирует сообщения, вырабатываемые компилятором, когда для изменения закрытого элемента данных х вызывается функция cannotSetX, не являющаяся дружественной. Рисунки 7.5 и 7.6 предназначены для ознакомления с формальным механизмом использования дружественных функций; практические примеры использования дружественных функций появятся в последующих главах. [42]
Нужно избегать дружественных функций и дружественных классов, если только это не является крайне необходимым. Использование друзей нарушает инкапсуляцию класса. [43]
Дружественные функции используются для повышения производительности. Приведем формальный пример, показывающий, как работает дружественная функция. Далее в этой книге дружественные функции применяются для перегрузки операций, используемых классами, и для создания классов итераторов. Объекты классов контейнеров способны хранить множество элементов в форме, подобной массиву. [44]
Ключевой пункт при выполнении перегрузки операции - обеспечение той же лаконичности выражений для типов, определяемых пользователем, которую обеспечивает C для встроенных типов за счет богатого набора операций. Перегрузка операций не является автоматическим процессом, и для выполнения нужной процедуры программист должен написать перегружающую операцию функцию. Иногда эту роль лучше выполняют функции-элементы, иногда дружественные функции и, время от времени, эту роль могут выполнять функции, не являющиеся ни элементами, ни друзьями. [45]