Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT | страница 15
Дружественная функция не является элементом класса, но может обращаться ко всем его элементам, включая private и protect. Одна и та же функция может быть дружественной для двух или более классов.
В следующем примере определена функция Clear, дружественная для класса point. Дружественная функция Clear используется для изменения значения элементов данных m_x и m_y, объявленных как private:
>//==========================================================
>// Класс point
>class point {
>public:
>// Функция Clear объявляется дружественной классу point
> friend void point::Clear(point*);
> // Интерфейс класса…
> private:
> int m_x;
> int m_y;
>};
>//==========================================================
>// Функция Clear
>void Clear(point* ptrPoint) {
> // Обращаемся к элементам класса, объявленным как private
> ptrPoint->m_x = 0;
> ptrPoint->m_y = 0;
> return;
>}
>//==========================================================
>// Главная функция
>void main() {
> point pointTestPoint;
> // Вызываем дружественную функцию
> Clear(&pointTestPoint);
>}
С помощью ключевого слова friend вы можете объявить некоторые методы одного класса дружественными для другого класса. Такие методы могут обращаться ко всем элементам класса, даже объявленным как private и protect, несмотря на то, что сами они входят в другой класс.
В следующем примере мы определяем два класса – line и point. В классе point определяем метод Set и объявляем его в классе line как дружественный. Дружественный метод Set может обращаться ко всем элементам класса line:
>// Предварительное объявление класса line
>class line;
>//==========================================================
>// Класс point
>class point {
>public:
> // Метод Set класса point
> void Set(line*);
> // …
>};
>//==========================================================
>// Класс line
>class line {
>public:
> // Метод Set класса point объявляется дружественной
> // классу point
> friend void point::Set(line*);
>private:
> int begin_x, begin_y;
> int end_x, end_y;
>};
>//==========================================================
>// Функция Clear
>void point::Set(line* ptrLine) {
> // Обращаемся к элементам класса line, объявленным как
> // private
> ptrLine->begin_x = 0;
> ptrLine->begin_y = 0;
> // …
> return;
>}
>//==========================================================
>// Главная функция
>void main() {
> point pointTestPoint;
> line lineTestPoint;
>// Вызываем дружественный метод
> pointTestPoint.Set(&lineTestPoint);
>}
По аналогии с дружественными функциями и методами, можно объявить дружественный класс. Все методы дружественного класса, могут обращаться ко всем элементам класса, включая элементы, объявленные как private и protect.