друг Функции/классы

Иногда вам может понадобиться разрешить функции, не являющейся членом данного класса, доступ к закрытым полям/методам этого класса. (Это особенно часто встречается при перегрузке операторов.)

Мы можем указать, что данная внешняя функция получает полные права доступа, поместив сигнатуру функции внутри класса, перед которой будет стоять слово friend. Таким образом, функция, не являющаяся членом, может получить доступ к закрытым и защищенным членам класса, если она объявлена ​​другом этого класса. Это делается путем включения объявления этой внешней функции в класс и предшествующего ему ключевого слова friend. То же самое происходит с классами, дружественный класс — это класс, члены которого имеют доступ к закрытым или защищенным членам другого класса:

// friend class
    #include <iostream>
    using namespace std;
class Square
    {
        friend class Rectangle;
private:
        int side;
public:
        Square(int a) : side(a) {}
    };
class Rectangle
    {
        int width, height;
public:
        int area()
        {
            return (width * height);
        }
        // void convert(Square a);
        void convert(Square sqr)
        {
            width = sqr.side;
            height = sqr.side;
        }
    };
int main()
    {
        Rectangle rect;
        Square sqr(4);
        rect.convert(sqr);
        cout << "Rectangle area: " << rect.area() << endl;
return 0;
    }

В этом примере класс Rectangle является другом класса Square, позволяя функциям-членам Rectangle получать доступ к закрытым и защищенным членам Square. Более конкретно, Rectangle обращается к переменной-члену Square::side, которая описывает сторону квадрата.

Ссылка: https://erlerobotics.gitbooks.io/