Λειτουργίες και τάξεις φίλων C ++ (με παραδείγματα)

Σε αυτό το σεμινάριο, θα μάθουμε να δημιουργούμε συναρτήσεις φίλων και τάξεις φίλων στο C ++ με τη βοήθεια παραδειγμάτων.

Η απόκρυψη δεδομένων είναι μια θεμελιώδης έννοια του αντικειμενοστρεφούς προγραμματισμού. Περιορίζει την πρόσβαση ιδιωτικών μελών εκτός του μαθήματος.

Ομοίως, τα προστατευόμενα μέλη είναι προσβάσιμα μόνο από παράγωγες τάξεις και δεν είναι προσβάσιμα από έξω. Για παράδειγμα,

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

Ωστόσο, υπάρχει ένα χαρακτηριστικό στο C ++ που ονομάζεται λειτουργίες φίλου που παραβιάζει αυτόν τον κανόνα και μας επιτρέπει να έχουμε πρόσβαση σε συναρτήσεις μελών εκτός της τάξης.

Ομοίως, υπάρχει και μια τάξη φίλων , την οποία θα μάθουμε αργότερα σε αυτό το σεμινάριο.

φίλος Λειτουργία σε C ++

Μια λειτουργία φίλου μπορεί να έχει πρόσβαση στα ιδιωτικά και προστατευμένα δεδομένα μιας τάξης. Δηλώνουμε μια λειτουργία φίλου χρησιμοποιώντας τη friendλέξη-κλειδί μέσα στο σώμα της τάξης.

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

Παράδειγμα 1: Λειτουργία φίλου Λειτουργία

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

Παραγωγή

 Απόσταση: 5

Εδώ, addFive()είναι μια λειτουργία φίλου που μπορεί να έχει πρόσβαση τόσο σε ιδιωτικά όσο και σε δημόσια μέλη δεδομένων.

Αν και αυτό το παράδειγμα μας δίνει μια ιδέα για την έννοια της λειτουργίας ενός φίλου, δεν δείχνει ουσιαστική χρήση.

Μια πιο ουσιαστική χρήση θα λειτουργούσε σε αντικείμενα δύο διαφορετικών τάξεων. Τότε είναι που η λειτουργία φίλου μπορεί να είναι πολύ χρήσιμη.

Παράδειγμα 2: Προσθήκη μελών δύο διαφορετικών τάξεων

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

Παραγωγή

 Άθροισμα: 13

Σε αυτό το πρόγραμμα, ClassAκαι ClassBέχουν δηλωθεί add()ως λειτουργία φίλου. Έτσι, αυτή η συνάρτηση μπορεί να έχει πρόσβαση σε ιδιωτικά δεδομένα και των δύο κατηγοριών.

Ένα πράγμα που πρέπει να παρατηρήσετε εδώ είναι ότι η λειτουργία φίλου στο εσωτερικό ClassAείναι η χρήση του ClassB. Ωστόσο, δεν έχουμε ορίσει ClassBσε αυτό το σημείο.

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

Για να λειτουργήσει αυτό, χρειαζόμαστε μια προθεσμιακή δήλωση ClassBστο πρόγραμμά μας.

 // forward declaration class ClassB;

τάξη φίλων σε C ++

Μπορούμε επίσης να χρησιμοποιήσουμε μια τάξη φίλων στο C ++ χρησιμοποιώντας τη friendλέξη-κλειδί. Για παράδειγμα,

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

Όταν μια τάξη δηλώνεται ως τάξη φίλων, όλες οι λειτουργίες μέλους της τάξης φίλων γίνονται λειτουργίες φίλων.

Δεδομένου ότι classBείναι μια τάξη φίλων, μπορούμε να έχουμε πρόσβαση σε όλα τα μέλη classAαπό μέσα classB.

Ωστόσο, δεν έχουμε πρόσβαση σε μέλη ClassBαπό μέσα classA. Είναι επειδή η σχέση φίλου στο C ++ χορηγείται μόνο, δεν λαμβάνεται.

Παράδειγμα 3: Τάξη φίλων C ++

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

Παραγωγή

 Άθροισμα: 13

Εδώ, ClassBείναι μια τάξη φίλων ClassA. Έτσι, ClassBέχει πρόσβαση στα μέλη του classA.

Στο ClassB, έχουμε δημιουργήσει μια συνάρτηση add()που επιστρέφει το άθροισμα των numA και numB.

Δεδομένου ότι ClassBείναι μια τάξη φίλων, μπορούμε να δημιουργήσουμε αντικείμενα ClassAμέσα ClassB.

ενδιαφέροντα άρθρα...