Wprowadzenie do funkcji Friend w C ++

Unikalną cechą programu C ++ jest to, że wykorzystuje on enkapsulację, aby zachować zawijanie danych wraz ze wszystkimi swoimi funkcjami operacyjnymi w celu utworzenia pojedynczej jednostki. Zapewnia to, że dostęp do określonych danych mają tylko działające na nim zadania, a nie żadne inne zadanie poza tą klasą. Dlatego w przypadkach, gdy klasa zewnętrzna może potrzebować dostępu do tych konkretnych danych, używamy tej konkretnej funkcji zwanej funkcją „przyjaciela”. Wiemy, że używając słów kluczowych takich jak „chroniony” i „prywatny” nie możemy uzyskać dostępu do tych danych poza jego metodą. Jednak ze względu na aplikację w czasie rzeczywistym istnieje wiele przypadków, w których możemy potrzebować tych samych danych prywatnych / chronionych, a korzystanie z już zadeklarowanych danych jest zawsze bardziej zalecane niż tworzenie ich wielokrotnie. Zobaczmy, jak zadeklarować i używać funkcji Friend w C ++ w tym artykule.

Funkcja znajomego podczas deklarowania jest poprzedzona słowem kluczowym „przyjaciel”, jak pokazano poniżej:

Składnia :

class (
private
protected
friend (arguments list);
)
returnDatatype functionName(arguments list)(
//function from which protected and private keywords
//can be accessed from as this is a friend method of className
)
class (
private
protected
friend (arguments list);
)
returnDatatype functionName(arguments list)(
//function from which protected and private keywords
//can be accessed from as this is a friend method of className
)

Jak pokazano w powyższym kodzie, funkcja znajomego musi zostać zadeklarowana w tej samej klasie, w której zadeklarowano chronione lub prywatne słowo kluczowe, aby dane te były dostępne poza klasą. Ta funkcja może być zadeklarowana w dowolnym miejscu w całym programie, tak jak normalna metoda C ++. Definicja funkcji nie wymaga słów kluczowych, takich jak przyjaciele lub operatorzy rozdzielczości zakresu.

Przykłady funkcji Friend w programie C ++

Sprawdźmy nieco lepiej działanie funkcji przyjaciela, biorąc kilka przykładów poniżej.

Przykład 1

Kod:

/* C++ program which exhibits the working of friend function.*/
#include
using namespace std;
class Weight
(
private:
int kilo;
public:
Weight(): kilo(0) ( )
//Declaration of a friend function
friend int addWeight(Weight);
);
// Defining a friend function
int addWeight(Weight w)
(
//accessing private data from non-member function
w.kilo += 17;
return w.kilo;
)
int main()
(
Weight W;
cout<<"Weight: "<< addWeight(W);
return 0;
)

Wynik:

Tutaj funkcją znajomego jest metoda addWeight () zadeklarowana w klasie Weight. Kilo jest prywatnym słowem kluczowym zadeklarowanym w metodzie Weight, do którego następnie można uzyskać dostęp z funkcji addWeight. Ten przykład miał na celu jedynie pokazanie podstawowego użycia funkcji znajomego, chociaż nie ma tu zastosowania w czasie rzeczywistym. Zagłębimy się teraz w kilka sensownych przykładów.

Przykład nr 2

Kod:

#include
using namespace std;
// Forward declaration
class SecondClass;
class FirstClass (
private:
int first_num;
public:
FirstClass(): first_num(12) ( )
// Declaring a friend function
friend int divide(FirstClass, SecondClass);
);
class SecondClass (
private:
int sec_num;
public:
SecondClass(): sec_num(4) ( )
// Another friend declaration
friend int divide(FirstClass, SecondClass);
);
// Function divide() is the friend function of classes FirstClass and SecondClass
// that accesses the member variables first_num and sec_num
int divide(FirstClass fnum, SecondClass snum)
(
return (fnum.first_num / snum.sec_num);
)
int main()
(
FirstClass fnum;
SecondClass snum;
cout<<"The value got by dividing first by second number: "<< divide(fnum, snum);
return 0;
)

Wynik:

W tym przykładzie zarówno klasy FirstClass, jak i SecondClass mają funkcję divide () zadeklarowaną jako funkcję przyjaciela. Dlatego funkcja ta może uzyskać dostęp do danych zmiennych prywatnych z obu klas. Tutaj funkcja divide () służy do dodawania zmiennych prywatnych first_num i sec_num dwóch obiektów fnum i snum i zwraca jej wartość do głównej metody.

Aby to działało poprawnie, należy wykonać deklarację przekazywania dla SecondClass, jak pokazano w kodzie, ponieważ SecondClass jest przywoływany w FirstClass za pomocą programu:

friend int divide(FirstClass, SecondClass);

Klasa przyjaciela: Istnieje klasa przyjaciela podobnie jak funkcja przyjaciela. Klasa przyjaciela może również uzyskiwać dostęp zarówno do prywatnych, jak i chronionych zmiennych klasy, ponieważ jest ona jego przyjacielem.

Składnia :

class One(
friend class Two;
);
class Two(
);
class One(
friend class Two;
);
class Two(
);
class One(
friend class Two;
);
class Two(
);

Jak pokazano powyżej, klasa druga jest przyjacielem klasy pierwszej. Dlatego klasa druga może uzyskać dostęp do prywatnych i chronionych zmiennych klasy pierwszej. Ale klasa pierwsza nie ma dostępu do chronionych lub prywatnych zmiennych klasy drugiej, ponieważ nie jest to wzajemna przyjaźń. Dla wzajemnej przyjaźni powinniśmy to wyraźnie zadeklarować. W ten sam sposób ta przyjaźń klasy nie jest dziedziczona, co oznacza, że ​​klasa druga nie będzie przyjacielem podklas klasy pierwszej, nawet jeśli jest przyjacielem klasy pierwszej.

Przykład nr 3

Kod:

#include
#include
using namespace std;
class Perimeter(
int len, brd, perimeter, temp;
public:
Perimeter(int len, int brd):len(len), brd(brd)
()
void calcPerimeter()(
temp = len + brd;
perimeter = 2 * temp;
)
friend class printClass;
);
class printClass(
public:
void printPerimeter(Perimeter a)(
cout<<"Perimeter = "< )
);
int main()(
Perimeter a(10, 15);
a.calcPerimeter();
printClass p;
p.printPerimeter(a);
return 0;
)
#include
#include
using namespace std;
class Perimeter(
int len, brd, perimeter, temp;
public:
Perimeter(int len, int brd):len(len), brd(brd)
()
void calcPerimeter()(
temp = len + brd;
perimeter = 2 * temp;
)
friend class printClass;
);
class printClass(
public:
void printPerimeter(Perimeter a)(
cout<<"Perimeter = "< )
);
int main()(
Perimeter a(10, 15);
a.calcPerimeter();
printClass p;
p.printPerimeter(a);
return 0;
)

Wynik:

W tym kodzie mamy 2 klasy: Klasa obwodowa, która znajduje obwód za pomocą wartości długości i szerokości. Zmienne len, brd, perimeter i temp są prywatnymi zmiennymi obwodu klasy. Dlatego musimy uczynić printClass przyjacielem klasy Perimeter. Ten printClass wykorzystuje wartość obwodu obliczoną w funkcji calcPerimeter () w klasie obwód. Ponieważ wszyscy są członkami prywatnymi, musimy uczynić printPerimeter przyjacielem klasy Perimeter. Po wykonaniu tej czynności musimy utworzyć obiekt w klasie głównej, aby obliczyć obwód i przekazać ten obiekt do klasy printPerimeter, aby wyświetlić obwód.

Funkcje funkcji znajomego w C ++

  • Metoda i klasa, do której została ogłoszona jako przyjaciel, nie muszą być takie same.
  • Ponieważ nie znajduje się on w zakresie odpowiedniej klasy, nie można go wywołać za pomocą jego obiektu.
  • Można go również wywołać tak jak normalną metodę, nawet bez użycia obiektu.
  • Może bezpośrednio uzyskiwać dostęp do nazw członków, używając nazwy obiektu i operatora członkostwa kropkowego wraz z nazwą członka.
  • Nie ma ograniczeń, ponieważ można zadeklarować je w części prywatnej lub publicznej.

Wniosek

Biorąc pod uwagę wszystkie wyżej omówione funkcje i przykłady funkcji znajomego w C ++, należy również zachować ostrożność podczas korzystania z funkcji znajomego z licznymi funkcjami i klasami zewnętrznymi, ponieważ może to zmniejszyć znaczenie enkapsulacji różnych klas w programowaniu obiektowym. Dlatego może być zarówno dobrodziejstwem, jak i zmorą dla programisty.

Polecany artykuł

Jest to przewodnik po funkcji znajomego w C ++. Tutaj omawiamy wprowadzenie do znajomego w C ++ i jego przykłady wraz z implementacją i wyjściem kodu. możesz również przejrzeć nasze sugerowane artykuły, aby dowiedzieć się więcej -

  1. Funkcja rekurencyjna w C ++ (przykłady)
  2. Najważniejsze 11 funkcji C ++
  3. Biblioteka uczenia maszynowego C ++
  4. Funkcja mieszania w C z typami
  5. Funkcja mieszania w PHP ze składnią