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

    Листинг 15.1.  FRIEND.CPP (использование дружественных классов) 

    1:	#include <iostream.n> 
    2: 
    3:	class Pal { 
    4:	   friend class Buddy;	//	Buddy - друг класса Pal 
    5:	private: 
    6:	   int x;	//	Доступен членам Pal и Buddy 
    7:	protected: 
    8:	   void doublex(void) { x *= x; }	//	Доступен в Pal и Buddy 
    9:	public: 
    10:	   Pal() { x = 100; }	//	Доступна всем пользователям 
    11:	   Pal(int n) { x = n; }	// 
    12:	}; 
    13: 
    14:	class Buddy { 
    15:	private: 
    16:	   Pal palObject;	//	Доступен только членам Buddy 
    17:	public: 
    18:	   void ShowValues(void);	//	Доступна всем пользователям 
    19:	}; 
    20: 
    21:	main() 
    22:	{ 
    23:	Buddy aSuddy; 
    24: 
    25:	aBuddy.ShowValues(); 
    26:	return 0; 
    27:	} 
    28: 
    29:	void Buddy: :Showvalues(void) 
    30:	{ 
    31:	Pal aPal(1234); 
    22: 
    33:	cout « "\nBefore, palObject. x	==" « palObject.x; 
    34:	palObject . doublex( ) ; 
    35:	cout « "\nAfter, palObject. x	==" « palObject.x; 
    36:	cout « "\naPal.x == " « aPal.x	« "\n'; 
    37:	} 

    Модуль FRIEND начинается с объявления класса с именем Pal. В строке 4 
указывается, что второй класс Buddy  — друг класса Pal. Благодаря этой строке 
функции-члены класса Buddy имеют доступ к закрытым и лишкщенным членам 
объектов класса Pal. Конечно, класс Pal не имеет доступа к закрытым и 
защищенным членам Buddy. 
    В строке 16 в классе Buddy объявляется объект класса Pal. Запустив на 
выполнение код, вы можете убедиться что, хотя класс Buddy не состоит в родстве с 
Pal, функция-член ShowValuesO имеет непосредственный доступ к закрытому члену х 
и к защищенной функции-члену doгblex() (строки 29-37) класса Pal. 

    Взаимно дружественные классы 

    Два класса могут объявить себя друзьями, предоставив одному классу доступ к 
закрытым и защищенным членам другого класса. Конечно, это также устранит барьеры, 
препятствующие доступу к скрытым членам Часто возникающая необходимость 
объявления одних классов друзьями других свидетельствует о плохо продуманной 
иерархии классов. Лучше, чтобы как можно больше классов были друг другу 
"чужаками". 
   Чтобы  два класса стали взаимно дружественными, в каждом из классов 
следует указать другой дружественным, что предоставит доступ каждому из них к 
закрытым и защищенным членам другого класса. Чтобы AClass и BClass стали взаимно 
дружественными, их следует объявить таким образом:


    15. Передовые средства C++     369 137 
