Υπερφόρτωση συναρτήσεων ή function overloading στη Cpp

Υπερφόρτωση συναρτήσεων ή function overloading στη Cpp

Υπερφόρτωση συναρτήσεων ή 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

Το αποτέλεσμα που προκύπτει με την εισαγωγή του αριθμού 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);
 }

Απάντηση

Αυτός ο ιστότοπος χρησιμοποιεί το Akismet για να μειώσει τα ανεπιθύμητα σχόλια. Μάθετε πώς υφίστανται επεξεργασία τα δεδομένα των σχολίων σας.