Дружественные функции и классы C ++ (с примерами)

В этом руководстве мы научимся создавать дружественные функции и дружественные классы на 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.

Интересные статьи...