Определение классов друзей и разделов доступа - PullRequest
5 голосов
/ 07 апреля 2011

При определении класса как класса друга, имеет ли значение, в какой раздел доступа помещаются определения, и если да, то изменяет ли он членов, к которым у друга есть доступ?

class aclass
{
private:
   // friend bclass;

public:
   // friend bclass;

protected:
   // friend bclass;
};

class bclass
{};

Ответы [ 4 ]

3 голосов
/ 07 апреля 2011

Спецификаторы доступа не применяются к функции друга / Классу
Вы можете объявить функцию или класс Friend в любом Спецификаторе доступа, и Функция / Класс будет по-прежнему иметь доступ ко всем переменным-членам (Public, Protected & Private) этого Класса.

2 голосов
/ 07 апреля 2011

Как только вы поместите класс / функцию друга в данный класс (скажем, «класс») в любом месте .Он будет иметь доступ ко всем определенным членам класса (независимо от общего / частного / защищенного);например:

class aClass
{
public: int pub;  void fun1() {}
protected: int pro; void fun2() {}
private: int pri;  aClass(const aClass& o);  
  friend void outsider ();  
};

Функция друга снаружи () может получить доступ к pub, pro, pri, fun1, fun2;но не конструктор копирования класса в этом случае (если он нигде не определен).

1 голос
/ 07 апреля 2011

Класс / функция друга может получить доступ ко всем закрытым / защищенным / общедоступным членам класса, раздел доступа к которым размещен класс / функция друга не имеет значения.Предлагается поместить класс / функцию друга в публичный раздел, потому что друзья являются частью интерфейса класса.

1 голос
/ 07 апреля 2011

Функции друзей не размещаются внутри каких-либо методов доступа, поскольку по определению они не являются частью класса. Вы можете сделать что-то вроде этого:

class Elephants
{
 //friend void notAMemberFuncion(argument 123);

public:
// member functions;

protected:
// data members;
};
...