logo search
inf_otvety_24-40

29. Дружественные классы.

Если все методы какого-либо класса должны иметь доступ к скрытым полям другого, весь класс объявляется дружественным с помощью ключевого слова friend. В приведенном ниже примере класс mistress объявляется дружественным классу hero:

class hero{

... friend class mistress;}

class mistress{

... void f1();

void f1();}

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

Объявление friend не является спецификатором доступа и не наследуется. Обратите внимание на то, что класс сам определяет, какие функции и классы являются дружественными, а какие нет.

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

Например:

class A {public: int Fx();}

class B {public:

friend class A;

private:

}

Дружественный класс или член класса будет доступен только в том случае, если он был объявлен в области видимости самого класса или ранее во внешней области видимости, внутри которой располагается область видимости, содержащая объявление класса с объявлениями друзей класса.

Например:

class A {public:

// Класс расположен во внешней

// области видимости

int Fx1();

}

namespace classB {

class B {public:

friend class A;

friend class C;

private:

}

class C { public:

// Класс расположен в том же

// пространстве имен

int Fx2();

}

}

Дружественные классы не наследуются, и их дружественность не является транзитивной.

Например:

class A {int Fx();}

class B {friend class A;}

class C {friend class B;}

// Класс А не является

// дружественным классу C

class D : public B {}

// Класс А не является

// дружественным классу D