Дружественные классы
Дружественность – возможность использования метода двумя и более объектами различных классов, связанных отношениями общности. Дружественные классы необходимы в том случае, если не связанным отношением родства классам необходим доступ к закрытым или защищенным секциям одного из них. #include <iostream.h> //не правильный вариант class A {double x; public: A() {x=3.14;} }; class System: public A {public: void f() {cout<<x;} //доступ к переменной x закрыт }; //правильный вариант class A { friend class System; double x; public: A() {x=3.14;} }; class System {public: A obj; void f() {cout<<obj.x<<endl;} }; Свойства друзей: 1) отношение дружественности не наследуются, то есть, если A дружественен B, а C порожден от A, то это не означает, что C становится автоматически дружественным B; 2) свойство дружественности не транзитивно, то есть, если класс А дружественен классу В, а класс В – классу С, то А не становится автоматически дружественным классу С; 3) свойство дружественности не коммутативно, то есть, если A дружественен B, то это не означает, что B дружественен A. Но при этом A можно объявить дружественным B. Взаимодружественные классы class A; //неполное объявление класса class B { friend class A; public: void f(A* c1) {};}; class A; { friend class B;}; Раздел, в котором помещено объявление friend, не имеет значения. Обычно для наглядности объявление friend для класса помещается в первой секции. Когда дружественной объявляется функция, объявление обычно помещается там, где была бы записана эквивалентная функция-член. Единственное ограничение, налагаемое на объявление friend, заключается в том, что это объявление должно находиться внутри объявления класса. Дружественные функции Дружественные функции применяются для доступа к скрытым полям класса и представляют собой альтернативу методам. Пример использования дружественных функций: переопределенные операции вывода объектов. Правила описания и особенности дружественных функций: 1) дружественная функция объявляется внутри класса, к элементам которого ей нужен доступ, с ключевым словом friend; в качестве параметра ей должен передаваться объект или ссылка на объект класса; 2) дружественная функция может быть обычной функцией или методом другого ранее определенного класса; на нее не распространяется действие спецификаторов доступа, место размещения ее объявления в классе безразлично; 3) одна функция может быть дружественной сразу нескольким классам. class One; class Two { char *s2; public: Two(){s2="1, 2, 3";} void Show(One &c1);}; class One { friend void Two::Show(One &c1); char *s1; public: One() {s1="Testing...";}}; void Two::Show(One &c1) { cout<<c1.s1<<s2<<endl;}
void main() { One c1; Two c2; c2.Show(c1); return;} Использование дружественных функций не рекомендуется, поскольку они нарушают принцип инкапсуляции. ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|