функция общественного друга в C++?
Я видел некоторый код на C++ и у меня есть вопрос об этом:
class CRectangle {
int width, height;
public:
friend CRectangle duplicate (CRectangle);
};
переменные width
и height
частные, а метод duplicate()
общественный. Ключевое слово friend
предназначен для доступа к частным и защищенным функциям за пределами
4 ответов
если убрать friend
, эта функция станет методом-a function
, который объявлен внутри класса и является public method
(поскольку public:
)
если поставить friend
перед duplicate
, это значит, что ты объявить функция, которая не является членом класса, который принимает один аргумент - CRectangle
и что имеют доступ к private
/protected
члены класса.
второй случай требует определения для CRectangle duplicate( CRectangle )
оба случая разные.
изменить:
Для friend
спецификатор доступа не имеет значения.
по "второй случай требует определения для CRectangle duplicate( CRectangle )
", я имею в виду, что первый случай тоже требует определения, но
// vvvvvvvvvvvv
CRectangle CRectangle::duplicate( CRectangle )
золотое правило:
функции друга можно объявить под любым спецификатором доступа, правила спецификатора доступа не применяются к функциям друга.
в вашем примере
friend CRectangle duplicate (CRectangle);
объявляется как функция friend под public
спецификатор доступа, но он все равно будет вести себя точно так же, даже если объявлен под private
спецификатор доступа.
вы ошибочно принимаете функцию как функция-член и, следовательно, вопрос. Это не.Функция возвращает объект типа CRectangle
и является другом того же класса CRectangle
.
функции CRectangle duplicate (CRectangle)
доступ ко всем private & protected
члены класса CRectangle
потому что он объявлен friend of the class
не потому, что он объявлен под спецификатором открытого доступа.
просто: duplicate
не является членом CRectangle
. Вы заявляете duplicate
как свободная функция, функция которой является другом CRectangle
.
class C {
public:
friend void F(); // declares non-member F
void F(); // declares member F
};
это хороший вопрос, синтаксис немного запутанный.
синтаксис не означает, что duplicate
является функцией-членом класса CRectangle
. Скорее это означает, что функция (регулярная функция) duplcate
имеет доступ к личным данным CRectangle
. Его указание на то, что"разрешение предоставляется дублирующей функции".
функции duplicate
мая еще нужно объявляется и определяется как любая другая регулярная функция (вне CRectangle
класс.) Я предпочитаю делать это как напоминание о том, что это обычная бесплатная функция