В этом руководстве мы научимся создавать дружественные функции и дружественные классы на C ++ с помощью примеров.
Скрытие данных - фундаментальная концепция объектно-ориентированного программирования. Он ограничивает доступ частных членов извне класса.
Точно так же защищенные члены могут быть доступны только производным классам и недоступны извне. Например,
class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )
Однако в C ++ есть функция , называемая дружественными функциями, которая нарушает это правило и позволяет нам получать доступ к функциям-членам извне класса.
Точно так же есть класс друзей , о котором мы узнаем позже в этом руководстве.
Функция друга в C ++
Функция друга может получить доступ к личным и защищенным данным класса. Мы объявляем функцию друга, используя friend
ключевое слово внутри тела класса.
class className (… friend returnType functionName(arguments);… )
Пример 1: Работа функции друга
// C++ program to demonstrate the working of friend function #include using namespace std; class Distance ( private: int meter; // friend function friend int addFive(Distance); public: Distance() : meter(0) () ); // friend function definition int addFive(Distance d) ( //accessing private members from the friend function d.meter += 5; return d.meter; ) int main() ( Distance D; cout << "Distance: " << addFive(D); return 0; )
Вывод
Расстояние: 5
Вот addFive()
функция друга, которая может получить доступ как к частным, так и к открытым элементам данных.
Хотя этот пример дает нам представление о концепции функции друга, он не показывает какого-либо значимого использования.
Более осмысленное использование будет работать с объектами двух разных классов. В этом случае функция друга может оказаться очень полезной.
Пример 2: добавление членов двух разных классов
// Add members of two different classes using friend functions #include using namespace std; // forward declaration class ClassB; class ClassA ( public: // constructor to initialize numA to 12 ClassA() : numA(12) () private: int numA; // friend function declaration friend int add(ClassA, ClassB); ); class ClassB ( public: // constructor to initialize numB to 1 ClassB() : numB(1) () private: int numB; // friend function declaration friend int add(ClassA, ClassB); ); // access members of both classes int add(ClassA objectA, ClassB objectB) ( return (objectA.numA + objectB.numB); ) int main() ( ClassA objectA; ClassB objectB; cout << "Sum: " << add(objectA, objectB); return 0; )
Вывод
Сумма: 13
В этой программе ClassA
и ClassB
объявили add()
в друзья функцию. Таким образом, эта функция может получить доступ к приватным данным обоих классов.
Здесь следует отметить одну вещь: функция друга внутри ClassA
использует расширение ClassB
. Однако мы еще не определились ClassB
.
// inside classA friend int add(ClassA, ClassB);
Чтобы это работало, нам нужно предварительное объявление ClassB
в нашей программе.
// forward declaration class ClassB;
Friend Class в C ++
Мы также можем использовать дружественный класс в C ++, используя friend
ключевое слово. Например,
class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )
Когда класс объявляется дружественным классом, все функции-члены дружественного класса становятся дружественными функциями.
Поскольку classB
это класс друзей, мы можем получить доступ ко всем членам classA
изнутри classB
.
Однако мы не можем получить доступ к членам ClassB
изнутри classA
. Это потому, что дружеские отношения в C ++ только предоставляются, но не принимаются.
Пример 3: класс друга C ++
// C++ program to demonstrate the working of friend class #include using namespace std; // forward declaration class ClassB; class ClassA ( private: int numA; // friend class declaration friend class ClassB; public: // constructor to initialize numA to 12 ClassA() : numA(12) () ); class ClassB ( private: int numB; public: // constructor to initialize numB to 1 ClassB() : numB(1) () // member function to add numA // from ClassA and numB from ClassB int add() ( ClassA objectA; return objectA.numA + numB; ) ); int main() ( ClassB objectB; cout << "Sum: " << objectB.add(); return 0; )
Вывод
Сумма: 13
Вот вам ClassB
друг класса ClassA
. Итак, ClassB
имеет доступ к членам classA
.
В ClassB
, мы создали функцию, add()
которая возвращает сумму numA и numB.
Поскольку ClassB
это класс-друг, мы можем создавать объекты ClassA
внутри ClassB
.