функция общественного друга в 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 класс.) Я предпочитаю делать это как напоминание о том, что это обычная бесплатная функция