Υπερφόρτωση συναρτήσεων ή function overloading στη Cpp ονομάζεται η τεχνική προγραμματισμού η οποία επιτρέπει σε συναρτήσεις που έχουν το ίδιο όνομα να συνυπάρχουν αρμονικά μέσα στο ίδιο πρόγραμμα. Απαραίτητη προϋπόθεση είναι τα ορίσματα των δύο ή περισσότερων ομώνυμων συναρτήσεων να διαφέρουν ως προς τον τύπο ή το πλήθος τους ή και τα δύο.
Ο compiler αναλαμβάνει την αντιστοίχιση κάθε συνάρτησης με την ταυτόσημη έκδοσή της, αφού πρώτα έχει εντοπίσει το πλήθος των ορισμάτων και έχει αναγνωρίσει τον τύπο τους. Η διαδικασία αυτή ονομάζεται “ανάλυση συναρτήσεων” (function resolution). Η χρησιμότητα της εφαρμογής της πρακτικής αυτής διαφαίνεται στην ανάγκη δημιουργίας συναρτήσεων που εκτελούν παρόμοιες λειτουργίες, αλλά διέπονται από μικρές διαφορές.
Υπερφόρτωση συναρτήσεων ή function overloading στη Cpp: σύνταξη δήλωσης και χρήσης με παράδειγμα κώδικα
Το ακόλουθο πρόγραμμα επιδεικνύει την ορθή εφαρμογή της παραπάνω τεχνικής.
#include <iostream> #include <string.h> using namespace std ; int CalculateStudents ( int ) ; //1 int CalculateStudents ( int, int) ; //2 int CalculateStudents ( int, int, int ) ; //3 int CalculateStudents ( int, int, string ) ; //4 int main() { int students; //5 cout << “Εισάγετε πλήθος φοιτητών ανά αίθουσα: “ ; //6 cin >> students; //7 cout << “Πλήθος φοιτητών ανά αίθουσα: “ << CalculateStudents(students) << endl ; //8 cout << “Πλήθος φοιτητών στις τρεις αίθουσες του κτιρίου Α: “ <<CalculateStudents(students, 3) << endl; //9 cout << “Πλήθος φοιτητών συνολικά στα κτίρια Α και Β: “<<CalculateStudents(students, 3, 2) << endl ; //10 cout << “Άθροισμα φοιτητών που εισάγατε με το περσινό πλήθος φοιτητών: “<<CalculateStudents(students, 38, "testing overloading") << endl ; //11 return 0 ; } int CalculateStudents ( int s) //*1 { return ( s ) ; } int CalculateStudents ( int s, int m) //*2 { return ( s * m ) ; } int CalculateStudents ( int s, int m, int n) //*3 { return ( s * m * n ) ; } int CalculateStudents ( int s1, int s2, string str) //*4 { return (s1 + s2); }
Υπερφόρτωση συναρτήσεων ή function overloading στη Cpp: σύνταξη δήλωσης και χρήσης με επεξήγηση κώδικα
Ας μελετήσουμε τις γραμμές του κώδικα…
Στην περιοχή δηλώσεων συναρτήσεων:
- 1: δήλωση συνάρτησης με όνομα CalculateStudents που δέχεται ένα όρισμα τύπου int
- 2: δήλωση συνάρτησης με όνομα CalculateStudents που δέχεται δύο ορίσματα τύπου int
- 3: δήλωση συνάρτησης με όνομα CalculateStudents που δέχεται τρία ορίσματα τύπου int
- 4: δήλωση συνάρτησης με όνομα CalculateStudents που δέχεται δύο ορίσματα τύπου int και ένα όρισμα τύπου string
Στην περιοχή ανάλυσης συναρτήσεων μετά το κυρίως πρόγραμμα:
- *1: ανάλυση συνάρτησης με όνομα CalculateStudents που δέχεται ένα όρισμα τύπου int (επιστρέφει το όρισμα -int)
- *2: ανάλυση συνάρτησης με όνομα CalculateStudents που δέχεται δύο ορίσματα τύπου int (επιστρέφει το γινόμενό τους -int)
- *3: ανάλυση συνάρτησης με όνομα CalculateStudents που δέχεται τρία ορίσματα τύπου int (επιστρέφει το γινόμενό τους -int)
- *4: ανάλυση συνάρτησης με όνομα CalculateStudents που δέχεται δύο ορίσματα τύπου int και ένα όρισμα τύπου string (επιστρέφει το άθροισμα των ακέραιων ορισμάτων -int)
Στο κυρίως πρόγραμμα:
- 5: δήλωση μεταβλητής με όνομα students ακεραίου τύπου
- 6: εκτύπωση προτρεπτικού μηνύματος
- 7: αναμονή για εισαγωγή δεδομένων από το χρήστη και εκχώρηση στη μεταβλητή students
- 8: εκτύπωση μηνύματος και αποτελέσματος μέσω της συνάρτησης *1
- 9: εκτύπωση μηνύματος και αποτελέσματος μέσω της συνάρτησης *2
- 10: εκτύπωση μηνύματος και αποτελέσματος μέσω της συνάρτησης *3
- 11: εκτύπωση μηνύματος και αποτελέσματος μέσω της συνάρτησης *4
[ms_alert icon=”fa-star” box_shadow=”no” dismissable=”no” class=”” id=””]
Το όρισμα της συνάρτησης *4 με όνομα str και τύπο string δεν αξιοποιείται από τη συνάρτηση, αλλά είναι αρκετό για να δώσει στη συνάρτηση την ιδιαίτερη ταυτότητά της. Χρησιμοποιείται μόνο για την ικανοποίηση των προδιαγραφών της υπερφόρτωσης.
[/ms_alert]
Το αποτέλεσμα που προκύπτει με την εισαγωγή του αριθμού 5:
Πλήθος φοιτητών ανά αίθουσα: 5
Πλήθος φοιτητών στις τρεις αίθουσες του κτιρίου Α: 15
Πλήθος φοιτητών συνολικά στα κτίρια Α και Β: 30
Άθροισμα φοιτητών που εισάγατε με το περσινό πλήθος φοιτητών: 43
Υπερφόρτωση συναρτήσεων ή function overloading στη Cpp: προδιαγραφές υλοποίησης
Παρατηρούμε ότι οι συναρτήσεις που υπερφορτώνονται έχουν όλες το ίδιο όνομα και τον ίδιο τύπο επιστροφής (εδώ int) στο κυρίως πρόγραμμα. Η τεχνική της υπερφόρτωσης προϋποθέτει αυτές τις ομοιότητες- προδιαγραφές.
Στην περίπτωση διαφορετικού ονόματος μεταξύ δύο συναρτήσεων, προφανώς δεν προκύπτει κανένα πρόβλημα για τον compiler, καθώς η καθεμία έχει το δικό της identifier. Στην περίπτωση δύο συναρτήσεων με ίδιο όνομα, τύπο επιστροφής και πανομοιότυπα ορίσματα ως προς τον τύπο και το πλήθος, ο compiler εμφανίζει μήνυμα σφάλματος λόγω ύπαρξης διπλοτύπου.
Στην περίπτωση ίδιου ονόματος με διαφορετικό τύπο επιστροφής, η ανάλυση συναρτήσεων από τον compiler δεν είναι εφικτή. Κατά τη διαδικασία του function resolution, δε λαμβάνεται υπόψιν ο τύπος επιστροφής. Κατ’ επέκταση, ο compiler δεν μπορεί να αναγνωρίσει ποια από τις εκδόσεις τις συνάρτησης πρέπει να αντιστοιχίσει στην κλήση μέσω του κυρίως προγράμματος (conflict).
Για παράδειγμα, η ακόλουθη συνάρτηση δεν μπορεί να συνυπάρξει με υπερφόρτωση στο ίδιο πρόγραμμα αντί της συνάρτησης *4, διότι δεν πληροί την προδιαγραφή του ίδιου τύπου επιστροφής:
string CalculateStudents ( int s1, int s2, string str ) { return (str); }