Программирование на языке высокого уровня. Марапулец Ю.В. - 87 стр.

UptoLike

Составители: 

void X::member_func(int a)
{
i=a;
} // прямой доступ к private-элементам
Х xobj; // объект класса Х
friend_func(&xobj, 6); // вызов дружественной функции
xobj.member_func(6); // вызов члена класса
С помощью описания
friend имя_класса можно объявить все функции класса дру-
жественными для другого класса:
class Y; // неполное описание
class X {friend Y; int i; void member_func(void); };
class Y {void friend_xl(X&); voidfriend_x2(X*); };
В данном случае все функции, описанные в Y есть дружественные в X. Возможно
также отдельные функции-члены класса объявить дружественными для другого класса:
class Х
{
void member_funcx(void);
};
class Y
{
int i;
friend void X
::member_funcx(void);
};
Отношение "дружественности" не является транзитивным: Х дружественно Y, Y
дружественно Z, но не обязательно Х дружественно Z. Вместе с тем отношение друже-
ственности наследуется.
Использования дружественных функций нужно по возможности избегать, посколь-
ку они нарушают принцип инкапсуляции и, таким образом, затрудняют отладку и моди-
фикацию программы.
Если все методы какого-либо класса должны иметь доступ к скрытым полям дру-
гого, весь класс объявляется дружественным с помощью ключевого слова friend. В при-
веденном ниже примере класс A объявляется дружественным классу B:
class B
{
friend class A;
}
class A
{
void f1():
void f2();
}
Функции f1 и f2 являются дружественными по отношению к классу B (хотя и опи-
саны без ключевого слова friend) и имеют доступ ко всем его полям.
Объявление friend не является спецификатором доступа и не наследуется.
87
void X::member_func(int a)
{
       i=a;
} // прямой доступ к private-элементам
…
Х xobj; // объект класса Х
friend_func(&xobj, 6); // вызов дружественной функции
xobj.member_func(6); // вызов члена класса

     С помощью описания friend имя_класса можно объявить все функции класса дру-
жественными для другого класса:

class Y; // неполное описание
class X {friend Y; int i; void member_func(void); };
class Y {void friend_xl(X&); voidfriend_x2(X*); };

     В данном случае все функции, описанные в Y есть дружественные в X. Возможно
также отдельные функции-члены класса объявить дружественными для другого класса:

class Х
{
      void member_funcx(void);
};
class Y
{
      int i;
      friend void X::member_funcx(void);
};

      Отношение "дружественности" не является транзитивным: Х дружественно Y, Y
дружественно Z, но не обязательно Х дружественно Z. Вместе с тем отношение друже-
ственности наследуется.
      Использования дружественных функций нужно по возможности избегать, посколь-
ку они нарушают принцип инкапсуляции и, таким образом, затрудняют отладку и моди-
фикацию программы.
      Если все методы какого-либо класса должны иметь доступ к скрытым полям дру-
гого, весь класс объявляется дружественным с помощью ключевого слова friend. В при-
веденном ниже примере класс A объявляется дружественным классу B:

class B
{
      friend class A;
}
class A
{
      void f1():
      void f2();
}

     Функции f1 и f2 являются дружественными по отношению к классу B (хотя и опи-
саны без ключевого слова friend) и имеют доступ ко всем его полям.
     Объявление friend не является спецификатором доступа и не наследуется.

                                              87