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ą friend
sł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 ClassA
i ClassB
zadeklarował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 ClassA
używa rozszerzenia ClassB
. Jednak nie zdefiniowaliśmy ClassB
w tym momencie.
// inside classA friend int add(ClassA, ClassB);
Aby to zadziałało, potrzebujemy deklaracji ClassB
w naszym programie.
// forward declaration class ClassB;
Friend Class w C ++
Możemy również użyć klasy znajomego w C ++ za pomocą friend
sł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ż classB
jest to klasa przyjaciół, możemy uzyskać dostęp do wszystkich członków classA
od wewnątrz classB
.
Nie możemy jednak uzyskać dostępu do członków ClassB
witryny 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 ClassB
jest klasa przyjaciół ClassA
. Więc ClassB
ma dostęp do członków classA
.
W programie ClassB
stworzyliśmy funkcję, add()
która zwraca sumę numA i numB.
Ponieważ ClassB
jest to klasa przyjaciół, możemy tworzyć obiekty ClassA
wewnątrz ClassB
.