Funkcje i klasy znajomych w języku C ++ (z przykładami)

W tym samouczku nauczymy się tworzyć funkcje zaprzyjaźnione i klasy znajomych w C ++ na podstawie przykładów.

Ukrywanie danych to podstawowa koncepcja programowania obiektowego. Ogranicza dostęp prywatnych członków spoza klasy.

Podobnie chronione elementy członkowskie są dostępne tylko za pomocą klas pochodnych i są niedostępne z zewnątrz. Na przykład,

 class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )

Jednak w C ++ istnieje funkcja zwana funkcjami zaprzyjaźnionymi, która łamie tę zasadę i umożliwia nam dostęp do funkcji składowych spoza klasy.

Istnieje również klasa znajomego , której nauczymy się w dalszej części tego samouczka.

friend Funkcja w C ++

Funkcja znajomego może uzyskać dostęp do prywatnych i chronionych danych klasy. Deklarujemy funkcję zaprzyjaźnioną za pomocą friendsłowa kluczowego w treści klasy.

 class className (… friend returnType functionName(arguments);… )

Przykład 1: Działanie funkcji znajomego

 // 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; )

Wynik

 Odległość: 5

Oto addFive()funkcja znajomego, która może uzyskać dostęp zarówno do prywatnych, jak i publicznych członków danych.

Chociaż ten przykład daje nam wyobrażenie o koncepcji funkcji znajomego, nie pokazuje żadnego sensownego zastosowania.

Bardziej sensownym zastosowaniem byłoby operowanie na obiektach dwóch różnych klas. Wtedy funkcja znajomego może być bardzo pomocna.

Przykład 2: Dodaj członków dwóch różnych klas

 // 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; )

Wynik

 Suma: 13

W tym programie ClassAi ClassBzadeklarowałem add()jako przyjaciel funkcję. W ten sposób ta funkcja może uzyskać dostęp do prywatnych danych obu klas.

Należy tu zauważyć, że funkcja znajomego w środku ClassAużywa rozszerzenia ClassB. Jednak nie zdefiniowaliśmy ClassBw tym momencie.

 // inside classA friend int add(ClassA, ClassB);

Aby to zadziałało, potrzebujemy deklaracji ClassBw naszym programie.

 // forward declaration class ClassB;

Friend Class w C ++

Możemy również użyć klasy znajomego w C ++ za pomocą friendsłowa kluczowego. Na przykład,

 class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )

Gdy klasa jest zadeklarowana jako klasa zaprzyjaźniona, wszystkie funkcje składowe tej klasy stają się funkcjami zaprzyjaźnionymi.

Ponieważ classBjest to klasa przyjaciół, możemy uzyskać dostęp do wszystkich członków classAod wewnątrz classB.

Nie możemy jednak uzyskać dostępu do członków ClassBwitryny od wewnątrz classA. Dzieje się tak, ponieważ relacja zaprzyjaźniona w C ++ jest tylko udzielana, a nie pobierana.

Przykład 3: klasa znajomego 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; )

Wynik

 Suma: 13

Tutaj ClassBjest klasa przyjaciół ClassA. Więc ClassBma dostęp do członków classA.

W programie ClassBstworzyliśmy funkcję, add()która zwraca sumę numA i numB.

Ponieważ ClassBjest to klasa przyjaciół, możemy tworzyć obiekty ClassAwewnątrz ClassB.

Interesujące artykuły...