C ++ kaveritoiminnot ja luokat (esimerkkien avulla)

Tässä opetusohjelmassa opimme luomaan kaveritoimintoja ja ystäväluokkia C ++ -sovelluksessa esimerkkien avulla.

Datan piilottaminen on olio-ohjelmoinnin peruskäsite. Se rajoittaa yksityisten jäsenten pääsyä luokan ulkopuolelta.

Samoin suojattuihin jäseniin pääsee vain johdetuilla luokilla, eikä niihin pääse ulkopuolelta. Esimerkiksi,

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

On kuitenkin ominaisuus C ++ kutsutaan ystävä toimintoja , jotka rikkovat tätä sääntöä, ja antaa meille mahdollisuuden käyttää jäsenfunktioiden ulkopuolelta luokassa.

Vastaavasti on myös ystäväluokka , jonka opimme myöhemmin tässä opetusohjelmassa.

ystävä Toiminto C ++: ssa

Ystävä toimintoa voi käyttää yksityisiä ja suojattuja tietoja luokan. Julistamme ystävätoiminnon käyttämällä friendavainsanaa luokan rungossa.

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

Esimerkki 1: Ystävätoiminnon toiminta

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

Tuotos

 Etäisyys: 5

Tässä addFive()on ystävätoiminto, joka voi käyttää sekä yksityisiä että julkisia tietoja.

Vaikka tämä esimerkki antaa meille käsityksen ystävätoiminnon käsitteestä, se ei osoita merkityksellistä käyttöä.

Merkityksellisempi käyttö olisi kahden eri luokan esineiden käyttö. Silloin ystävätoiminto voi olla erittäin hyödyllinen.

Esimerkki 2: Lisää jäseniä kahteen eri luokkaan

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

Tuotos

 Summa: 13

Tässä ohjelmassa ClassAja ClassBovat ilmoittaneet add()ystävätoiminnoksi. Siten tämä toiminto voi käyttää molempien luokkien yksityisiä tietoja.

Yksi asia huomata tässä on ystävätoiminto sisällä ClassAkäyttää ClassB. Emme kuitenkaan ole määritelleet ClassBtässä vaiheessa.

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

Jotta tämä toimisi, tarvitsemme ClassBohjelmassamme ennakkoilmoituksen.

 // forward declaration class ClassB;

ystäväluokka C ++

Voimme käyttää myös ystäväluokkaa C ++: ssa friendavainsanalla. Esimerkiksi,

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

Kun luokka julistetaan ystäväluokaksi, kaikista ystäväluokan jäsentoiminnoista tulee ystävätoimintoja.

Koska classBse on ystäväluokka, voimme käyttää kaikkia jäseniä classAsisältäpäin classB.

Emme kuitenkaan voi käyttää jäseniä ClassBsisältäpäin classA. Se johtuu siitä, että ystävyyssuhde C ++: ssa vain myönnetään, ei oteta.

Esimerkki 3: C ++ -kaveriluokka

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

Tuotos

 Summa: 13

Tässä ClassBon ystäväluokka ClassA. Joten, ClassBhänellä on pääsy jäseniin classA.

Vuonna ClassBolemme luoneet funktion, add()joka palauttaa numA: n ja numB: n summan.

Koska ClassBse on ystäväluokka, voimme luoda esineitä sen ClassAsisälle ClassB.

Mielenkiintoisia artikkeleita...