Sissejuhatus sõbra funktsiooni C ++

C ++ programmi ainulaadne omadus on see, et see kasutab kapseldamist, et hoida andmed mähisena koos kõigi selle tööfunktsioonidega üksiku üksuse moodustamiseks. See tagab, et konkreetsetele andmetele pääseb juurde ainult sellel töötavate ülesannete kaudu, mitte ühegi muu selle klassi väliste toimingute kaudu. Seega, kui välisklass võib vajada juurdepääsu sellele konkreetsele andmetele, kasutame seda konkreetset funktsiooni, mida nimetatakse sõbraks. Me teame, et kasutades märksõnu nagu „kaitstud” ja „privaatne”, ei pääse me andmetele juurde selle meetodi abil. Kuid reaalajas rakenduse huvides on palju juhtumeid, kus me vajame samu privaatseid / kaitstud andmeid ja juba deklareeritud andmete kasutamine on alati eelistatavam kui nende mitu korda loomine. Vaatame, kuidas selles artiklis C ++ -s sõbrafunktsiooni deklareerida ja seda kasutada.

Sõbrafunktsioonile deklareerimisel eelneb märksõna “sõber”, nagu siin näidatud:

Süntaks :

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
)

Nagu ülaltoodud koodist nähtub, tuleb sõbra funktsioon kuulutada samasse klassi, kus kaitstud või privaatne märksõna on deklareeritud, et neile andmetele oleks juurdepääs väljaspool klassi. Seda funktsiooni lubatakse deklareerida kõikjal kogu programmis nagu tavalist C ++ meetodit. Funktsiooni määratlus ei vaja märksõnu, nagu sõbrad või ulatuse eraldusvõimega operaatorid.

Näited sõbra funktsioonist programmis C ++

Vaatame allpool paari näidet, kuidas sõbra funktsioon toimib.

Näide nr 1

Kood:

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

Väljund:

Sõbrafunktsiooniks on siin addWeight () meetod, mis kuulutatakse kaaluklassi piires. Kilo on kaalumeetodi sees kuulutatud privaatne märksõna, millele pääseb juurde selle tõttu funktsioonist addWeight. See näide oli lihtsalt sõbrafunktsiooni põhikasutuse tutvustamiseks, ehkki siin pole reaalajas kasutamist. Vaatleme nüüd sügavale mõne tähendusrikka näite juurde.

Näide 2

Kood:

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

Väljund:

Selles näites on klassidel FirstClass ja SecondClass jagatud (), mis on deklareeritud sõbrafunktsioonina. Seega pääseb see funktsioon juurde mõlema klassi privaatsete muutujate andmetele. Siin kasutatakse funktsiooni split () kahe objekti fnum ja snum privaatmuutujate first_num ja sec_num lisamiseks ning selle väärtuse tagastamiseks põhimeetodile.

Selle korrektseks toimimiseks tuleb SecondClassi jaoks edastada deklaratsioon vastavalt koodile, kuna SecondClassile viidatakse programmiga FirstClass:

friend int divide(FirstClass, SecondClass);

Sõbraklass: on ka sõbra klass, nagu ka sõbra funktsioon. Sõbraklass pääseb juurde ka klassi privaatsetele ja kaitstud muutujatele, kuna see on tema sõber.

Süntaks :

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

Nagu eespool näidatud, on teine ​​klass klassi üks sõber. Seega pääseb klass 2 juurde esimese klassi privaatsetele ja kaitstud muutujatele. Kuid 1. klass ei pääse juurde teise klassi kaitstud või privaatsetele muutujatele, kuna see pole vastastikune sõprus. Vastastikuseks sõpruseks peaksime selle selgesõnaliselt kuulutama. Samamoodi ei pärita seda klassi sõprust, mis tähendab, et teine ​​klass ei tohi olla klassi esimese alamklasside sõber, isegi kui ta on esimese klassi sõber.

Näide 3

Kood:

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

Väljund:

Selles koodis on meil 2 klassi: Perimeetri klass, mis leiab perimeetri pikkuse ja laiuse väärtuste abil. Muutujad len, brd, perimeeter ja temp on kõik klassi perimeetri privaatsed muutujad. Seetõttu peame printClassist saama Perimeetri klassi sõbraks. See printClass kasutab perimeetri väärtust, mis on arvutatud funktsioonis calcPerimeter () Perimeetri klassis. Kuna nad kõik on eraõiguslikud liikmed, peame tegema printPerimeterist Perimeetri klassi sõbra. Kui see on tehtud, peame perimeetri arvutamiseks looma põhiklassi objekti ja edastama selle objekti ümbermõõdu kuvamiseks printPerimeter klassi.

Sõbrafunktsiooni tunnused funktsioonis C ++

  • Meetod ja klass, kellele ta on tunnistatud sõbraks, ei pea olema samad.
  • Kuna see ei kuulu vastava klassi ulatusse, ei saa seda oma objekti kasutades kutsuda.
  • Seda võib nimetada ka tavaliseks meetodiks, isegi ilma objekti kasutamata.
  • Liikmelistele pääseb otse juurde ainult siis, kui kasutab koos oma nimega objekti nime ja punktiliikme operaatorit.
  • Piirangud puuduvad, kuna seda on lubatud deklareerida nii era- kui ka avalikus osas.

Järeldus

Arvestades kõiki eelpool käsitletud funktsioone ja sõbra funktsiooni näiteid C ++ -s, tuleb olla ettevaatlik, kasutades sõbra funktsioone, millel on arvukalt funktsioone ja väliseid klasse, kuna see võib vähendada erinevate klasside kapseldamise tähtsust objektorienteeritud programmeerimises. Seega võib see programmeerijale olla nii õnnistuseks kui ka takistuseks.

Soovitatav artikkel

See on C ++ -s olev sõbrafunktsiooni juhend. Siin käsitleme funktsiooni C ++ funktsiooni Sissejuhatus sõbrale ja selle näiteid koos koodi juurutamise ja väljundiga. lisateabe saamiseks võite tutvuda ka meie soovitatud artiklitega -

  1. Rekursiivne funktsioon C ++-s (näited)
  2. C ++ 11 peamist funktsiooni
  3. Masinõppe C ++ raamatukogu
  4. C-tüüpi räsimisfunktsioon
  5. Räsimisfunktsioon PHP-s süntaksiga

Kategooria: