C ++ Friend funkciók és osztályok (példákkal)

Ebben az oktatóanyagban megtanulunk példák segítségével barátfüggvényeket és barátosztályokat létrehozni C ++ nyelven.

Az adatok elrejtése az objektum-orientált programozás alapfogalma. Korlátozza az osztályon kívüli magántagok hozzáférését.

Hasonlóképpen, a védett tagokhoz csak származtatott osztályok férhetnek hozzá, és kívülről nem érhetők el. Például,

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

Azonban van egy olyan funkció, C ++ nevű barátja funkciók , hogy megszeged ezt a szabályt, és lehetővé teszi számunkra, hogy hozzáférést tagja funkciók az osztályon kívül.

Hasonlóképpen van egy ismerős osztály is, amelyet később megismerünk ebben az oktatóanyagban.

barát Funkció a C ++ nyelven

A Friend funkció hozzáférhet egy osztály privát és védett adataihoz. Egy barát funkciót deklarálunk friendaz osztálytest belsejében található kulcsszóval.

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

1. példa: A barát funkciójának működése

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

Kimenet

 Távolság: 5

Itt addFive()van egy barát funkció, amely hozzáférhet mind a privát, mind a nyilvános adattagokhoz.

Bár ez a példa ötletet ad nekünk a barátfunkció fogalmáról, nem mutat semmilyen értelmes felhasználást.

Értelmesebb felhasználás két különböző osztályú objektumokra vonatkozik. Ekkor a barát funkció nagyon hasznos lehet.

2. példa: Két különböző osztály tagjainak felvétele

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

Kimenet

 Összeg: 13

Ebben a programban, ClassAés ClassBdeklarálta, add()mint egy barát funkció. Így ez a funkció mindkét osztály privát adataihoz hozzáférhet .

Egy dolgot kell itt észrevennünk, hogy a barát funkció benne ClassAvan, a ClassB. Ezen ClassBa ponton azonban még nem határoztuk meg.

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

Ahhoz, hogy ez működjön, ClassBa programunkra előre kell nyilatkoznunk .

 // forward declaration class ClassB;

barát osztály a C ++ kategóriában

A friendkulcsszóval használhatunk egy barát osztályt is C ++ nyelven . Például,

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

Amikor egy osztályt baráti osztálynak nyilvánítanak, a barátosztály összes tagfunkciója barátfunkcióvá válik.

Mivel classBez egy ismerős osztály, classAbelülről minden tagot elérhetünk classB.

ClassBBelülről azonban nem férhetünk hozzá classA. Ez azért van, mert a baráti kapcsolat a C ++ - ban csak megadatott, nem vehető át.

3. példa: C ++ barát osztály

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

Kimenet

 Összeg: 13

Itt ClassBvan egy ismerős osztály ClassA. Tehát ClassBhozzáfér a tagokhoz classA.

A ClassBhoztunk létre egy funkciót add(), hogy a hozam összege Numa és elzsibbadt.

Mivel ClassBez egy barát osztály, létrehozhatunk ClassAbelsejében tárgyakat ClassB.

érdekes cikkek...