Introduktion til Friend-funktion i C ++

En unik egenskab ved C ++ -programmet er, at det bruger indkapsling for at holde dataene pakket sammen med alle dets driftsfunktioner til at udgøre en individuel enhed. Dette sikrer, at de bestemte data kun kan få adgang til de opgaver, der fungerer på dem, og ikke af andre opgaver uden for denne klasse. I de tilfælde, hvor den eksterne klasse muligvis har brug for at få adgang til disse bestemte data, bruger vi derfor denne specifikke funktion kaldet “ven” -funktionen. Vi ved, at vi ved hjælp af nøgleord som "beskyttet" og "privat" ikke har adgang til disse data uden for deres metode. Men med hensyn til realtidsansøgning er der mange tilfælde, hvor vi muligvis har brug for de samme private / beskyttede data, og at bruge de allerede erklærede er altid mere at foretrække end at oprette dem mange gange. Lad os se, hvordan vi erklærer og bruger en vensfunktion i C ++ i denne artikel.

En venfunktion, mens deklarerer, foregår med "ven" nøgleordet som vist her:

Syntaks :

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
)

Som vist i ovenstående kode skal venefunktionen deklareres i den samme klasse, hvor det beskyttede eller private nøgleord er blevet erklæret for at disse data skal være tilgængelige uden for klassen. Denne funktion tillades at deklareres overalt i hele programmet ligesom en normal C ++ -metode. Funktionsdefinitionen kræver ikke nøgleord som venner eller nogen operatører af rækkeviddeopløsning.

Eksempler på Friend-funktion i C ++ -programmet

Lad os tjekke, hvordan venefunktionen fungerer lidt bedre ved at tage et par eksempler nedenfor.

Eksempel 1

Kode:

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

Produktion:

Her er venefunktionen addWeight () -metoden, der er erklæret inden for vægtklassen. Kilo er det private nøgleord, der er erklæret inden for vægtmetoden, som derefter fås adgang til fra addWeight-funktionen på grund af den. Dette eksempel var bare for at vise den grundlæggende brug af en vensfunktion, selvom der ikke er nogen brug i realtid her. Lad os nu dybt ned i nogle meningsfulde eksempler.

Eksempel 2

Kode:

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

Produktion:

I dette eksempel har både klasserne FirstClass og SecondClass opdeling () erklæret som en venefunktion. Derfor kan denne funktion få adgang til de private variabeldata fra begge klasser. Her divideres () -funktionen til at tilføje private variabler first_num og sec_num for to objekter fnum og snum og returnerer dens værdi til hovedmetoden.

For at dette skal fungere korrekt, skal der foretages en fremsendelseserklæring for SecondClass som vist i koden, fordi der henvises til SecondClass inden for FirstClass ved hjælp af programmet:

friend int divide(FirstClass, SecondClass);

Veneklasse: Der er en veneklasse ligesom venefunktionen. Veneklasse kan også få adgang til både private og beskyttede variabler i klassen, da den er en ven til den.

Syntaks :

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

Som vist ovenfor er klasse to en ven af ​​klasse 1. Derfor har klasse to adgang til private og beskyttede variabler i klasse 1. Men klasse One har ikke adgang til beskyttede eller private variabler i klasse to, fordi dette ikke er et gensidigt venskab. For gensidigt venskab bør vi erklære det eksplicit. På samme måde er dette venskab i klassen ikke arvet, hvilket betyder, at klasse to ikke skal være en ven af ​​underklasserne i klasse 1, selvom det er en ven af ​​klasse en.

Eksempel 3

Kode:

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

Produktion:

I denne kode har vi 2 klasser: Omkretsklasse, der finder omkredsen ved hjælp af værdierne for længde og bredde. Variabler len, brd, perimeter og temp er alle private variabler i klasse perimeter. Derfor er vi nødt til at gøre printClass til en ven af ​​Perimeter-klassen. Dette printClass bruger Perimeter-værdien beregnet i funktionen calcPerimeter () i Perimeter-klassen. Da de alle er private medlemmer, er vi nødt til at gøre printPerimeter til en ven af ​​Perimeter-klassen. Når dette er gjort, er vi nødt til at oprette et objekt i hovedklassen for at beregne omkredsen og videregive dette objekt til klassen printPerimeter for at få vist omkredsen.

Funktioner ved Friend-funktion i C ++

  • Metoden og klassen, som den er erklæret som en ven, behøver ikke være den samme.
  • Da det ikke er inden for omfanget af den respektive klasse, kan det ikke kaldes ved hjælp af dets objekt.
  • Det kan også kaldes ligesom en normal metode, selv uden brug af objektet.
  • Det kan kun få direkte adgang til medlemsnavne ved hjælp af dets objektnavn og dot medlemskabsoperatør sammen med dets medlemsnavn.
  • Der er ingen begrænsning, da det er tilladt at blive erklæret i hverken privat eller offentlig del.

Konklusion

I betragtning af alle de ovennævnte funktioner og eksemplerne på venefunktion i C ++ skal man også være forsigtig, mens man bruger en vens funktioner med adskillige funktioner og eksterne klasser, da det kan mindske betydningen af ​​indkapsling af forskellige klasser i objektorienteret programmering. Derfor kan det være både en velsignelse og en bane for programmereren.

Anbefalet artikel

Dette er en guide til Venefunktion i C ++. Her diskuterer vi funktionen Introduktion til ven i C ++ og dens eksempler sammen med kodeimplementering og output. Du kan også gennemgå vores foreslåede artikler for at lære mere -

  1. Rekursiv funktion i C ++ (eksempler)
  2. Top 11 funktioner i C ++
  3. Machine Learning C ++ Library
  4. Hashing-funktion i C med typer
  5. Hashing-funktion i PHP med syntaks

Kategori: