Четвертый Borland C++ и его окружение

       

Дружественные функции


Обычно доступ к приватным элементам класса ограничивается методами этого класса. Но иногда возникает необходимость предоставить

доступ к приватным данным класса внешним функциям. Определить такие

внешние функции (которые могут даже находиться вне классов), которым

будет предоставлена возможность доступа к приватным элементам класса,

позволяет описание friend (дружественный). Иногда можно видеть, что

переопределенная операция также описывается, как дружественная, но,

обычно, дружественные функции используются редко. Их присутствие в

программе обычно означает то, что иерархия классов нуждается в видоизменении.

Рассмотрим пример. Возьмем наш класс sber_bank, с приватным элементом big_bucks и добавим в него "дружественную" функцию вычисления

налога - irs:

class sber_bank {

private: // Начало раздела private

double big_bucks; // элемент private



public: // Начало раздела public

void deposit(double bucks); // Элемент public

double withdraw(double bucks); // Элемент public

friend void irs(void); // Дружественная функция irs

};

Дружественную функцию irs определим следующим образом:

void irs(void)

{

big_bucks -= big_bucks * 0.10; // Взять 10% от итога

}

Отметим, что хотя мы объявили irs() внутри класса, но она не является функцией элементом! Это достигается благодаря ключевому слову

friend. Но даже хотя этот не функция элемент, irs() может выполнить

указанную операцию с нашими данными, имеющими тип private.

Если бы функция big_bucks была элементом другого класса (например, класса free_shop), то в описании friend нужно использовать операцию разрешения области действия:

friend void free_shop::irs(void);

Дружественным для описанного класса можно также сделать целый

класс, для чего в описании используется ключевое слово class:

friend class check_bucks;

После этого любая функция элемент класса check_bucks может получить доступ к приватным элементам класса sber_bank. Заметим, что в

С++, как и в жизни, дружественность не транзитивна: если А является

другом для Б, а Б является другом для И, то отсюда не следует, что А

является другом для И.

Дружественные описания следует использовать только в том случае,

когда это действительно необходимо, например, когда без этого пришлось бы использовать чересчур сложную иерархию классов. По своей природе дружественные описания уменьшают инкапсуляцию и модульность. В

частности, если нужно определить целый класс, как дружественный для другого класса, то вместо этого лучше рассмотреть возможность построения обоюдно порождаемого класса, который можно использовать для

доступа к нужным элементам.



Содержание раздела