Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OTVETY_K_EKZAMENU_PO_OOP.doc
Скачиваний:
10
Добавлен:
01.07.2025
Размер:
239.62 Кб
Скачать

18. Друзья класса.

Класс может предоставлять особые привилегии определеным внеш функциям или функциям-членам другого класса. Эти функции получили названия друж-веных. Если функция или класс объявлены как друж-веные даному классу, то такие функции или функции-члены такого класса могут осуществлять непосредственый доступ ко всем полям класса, для кот они друж-вены. Друж-веные функции и классы могут осуществлять прямой доступ к закрытым полям класса без использования функций-членов этого класса. Ключевое слово friend - спецификатор функции, кот дает функции - не члену класса доступ к скрытым членам класса. 0н используется для того, чтобы выйти за строгие рамки типизации и сокрытия даных в C++. Причины их использования: 1)некот функции нуждаются в привилегированом доступе более чем к одному классу; 2)friend-функция передает все парамы через список парамов, и значение каждого из них подчинено преобразованию, совместимому с назначением. Такие преобразования применяются к явно переданым аргументам-класам и поэтому особено полезны в случаях перегрузки оператора. 0бъявление friend функции должно появляться внутри объявления класса, которому она друж-вена. Имени функции предшествует ключевое слово friend, и ее объявление может находится как в public так и в private части класса, что не повлияет на значение. Функция-член одного класса может быть friend-функцией другого класса. Это происходит тогда, когда функция-член объявлена в friend класе с исп-нием оператора разрешения контекста для определения имени функции друж-веного класса. Если все функции-члены одного класса явл friend-функциями другого класса, то это можно определить записью: friend class имя класса; class tl {friend void a(); int b();}; // friend-функция и функция-член. class t2 {friend int tl::b();};// функ-член класса tl имеет доступ ко всем скрытым полям класса t2. class t3 {friend class tl; }; //все функции-члены класса tl имеют доступ ко

Friend-функции можно расматривать как часть общего интерфейса класса. Существует ряд ситуаций, в которых они могут быть альтернативой функциям-членам. Исп-ние friend-функций спорно, потому что они нарушают инкапсуляцию, окружающую private члены класов. Парадигма 00П утверждает, что объекты (в C++ они - переменые класса) доступны через их public члены. Только функции-члены должны иметь доступ к скрытой реализации. Это ясный и строгий принцип проектирования. Friend-функция находится на самой его границе, т. к. имеет доступ к private членам, сама не являясь функцией-членом. С ее помощью можно организовать быстрый код для доступа к подробностям реализации класса.

19. 0Бъекты с автоматически распределяемой памятью.

В этом случае объявление объекта синхронизируется с его созданием и имеет синтаксис:

ИмяКласа Идентификатор0бъекта(арг-ты); Здесь арг-ты должны соответствовать одному из конст-ров класса. Если они опущены (возможно, вместе со скобками), то используется конст-р по умолчанию. В момент объявления срабатывает соответствующий конст-р. Для доступа к методам класса: Идентификатор0бъекта. ИмяПеременой. Синтаксис вызова метода класса следующий: Идентификатор0бъекта. ИмяМетода (Арг-ты). Деструктор класса выполняется автоматически при выходе автоматической объектной переменой из области видимости. Пример: for(int i=0; i<30; i++){intarray a(1000000), b(l); a=b; }; Здесь оператор присваивания просто копирует даные из одного объекта в др, в том числе и указатель на масив fitems. В рез-те работы этого фрагмента кода произойдет утечка памяти размеров примерно 120Мb (на 32-разрядных сисмах). Для исключения такой ситуации необходимо использовать конст-р присваивания.