5.3 Υπερφόρτωση συναρτήσεων και αναδρομή στην γλώσσα C++

Η υπερφόρτωση συναρτήσεων (Function Overloading) στη C++ σας δίνει τη δυνατότητα να ορίσετε περισσότερες από μία συναρτήσεις με το ίδιο όνομα, αλλά με διαφορετικές υπογραφές (signatures). Η υπογραφή μιας συνάρτησης περιλαμβάνει το όνομα της συνάρτησης και τους τύπους των παραμέτρων της.

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

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

Παράδειγμα υπερφόρτωσης συναρτήσεων:

#include <iostream>

// Συνάρτηση για εκτύπωση ακεραίου
void print(int x) {
  std::cout << "The integer is: " << x << std::endl;
}

// Συνάρτηση για εκτύπωση δεκαδικού
void print(double x) {
  std::cout << "The double is: " << x << std::endl;
}

// Συνάρτηση για εκτύπωση συμβολοσειράς
void print(std::string x) {
  std::cout << "The string is: " << x << std::endl;
}

int main() {
  // Κλήσεις των συναρτήσεων print με διάφορα ορίσματα
  print(5); // Εκτυπώνει: The integer is: 5
  print(3.14); // Εκτυπώνει: The double is: 3.14
  print("Hello, world!"); // Εκτυπώνει: The string is: Hello, world!

  return 0;
}

Ο παραπάνω κώδικας συντάσσει τρεις συναρτήσεις με το όνομα print, οι οποίες χρησιμοποιούνται για την εκτύπωση διαφορετικών τύπων δεδομένων. Η πρώτη συνάρτηση δέχεται έναν ακέραιο (int) ως παράμετρο και εκτυπώνει το μήνυμα “The integer is: ” ακολουθούμενο από την τιμή του ακεραίου. Η δεύτερη συνάρτηση δέχεται έναν δεκαδικό αριθμό (double) και εκτυπώνει το μήνυμα “The double is: ” ακολουθούμενο από την τιμή του δεκαδικού. Η τρίτη συνάρτηση δέχεται μια συμβολοσειρά (std::string) και εκτυπώνει το μήνυμα “The string is: ” ακολουθούμενο από την τιμή της συμβολοσειράς.

Στη συνέχεια, η συνάρτηση main καλεί τις συναρτήσεις print με διάφορες παραμέτρους για να εκτυπώσει διάφορα μηνύματα στην οθόνη. Πιο συγκεκριμένα, καλεί την print με τιμή 5, που είναι ακέραιος, και εκτυπώνει το μήνυμα “The integer is: 5”. Στη συνέχεια, καλεί την print με τιμή 3.14, που είναι δεκαδικός, και εκτυπώνει το μήνυμα “The double is: 3.14”. Τέλος, καλεί την print με τη συμβολοσειρά “Hello, world!” και εκτυπώνει το μήνυμα “The string is: Hello, world!”.

Ο κώδικας επιστρέφει την τιμή 0 από τη συνάρτηση main, υποδηλώνοντας ότι το πρόγραμμα ολοκληρώθηκε επιτυχώς.

Ας δούμε ένα παράδειγμα που περιγράφει δύο συναρτήσεις που προσθέτουν αριθμούς διαφορετικού τύπου:

#include <iostream>

// Συνάρτηση που προσθέτει δύο ακέραιους αριθμούς
int add(int x, int y) {
  return x + y;
}

// Συνάρτηση που προσθέτει δύο πραγματικούς αριθμούς
double add(double x, double y) {
  return x + y;
}

int main() {
  std::cout << add(5, 7) << std::endl;       // Κλήση της συνάρτησης add με ακέραιους
  std::cout << add(3.14, 2.71) << std::endl; // Κλήση της συνάρτησης add με πραγματικούς
  return 0;
}

Ο παραπάνω κώδικας περιλαμβάνει τη δήλωση και τον ορισμό δύο συναρτήσεων add.

Η πρώτη συνάρτηση add δέχεται δύο ακέραιες παραμέτρους x και y, και επιστρέφει το άθροισμά τους ως ακέραιο αποτέλεσμα.

Η δεύτερη συνάρτηση add δέχεται δύο πραγματικές παραμέτρους x και y, και επιστρέφει το άθροισμά τους ως πραγματικό αποτέλεσμα.

Στη συνέχεια, η main συνάρτηση χρησιμοποιεί τις παραπάνω συναρτήσεις. Καλεί την add πρώτη φορά με δύο ακέραιες τιμές (5 και 7) και εκτυπώνει το αποτέλεσμα χρησιμοποιώντας το αντικείμενο std::cout. Έπειτα, καλεί την add δεύτερη φορά με δύο πραγματικές τιμές (3.14 και 2.71) και ξανά εκτυπώνει το αποτέλεσμα.

Ο κώδικας εκτελείται και τα αποτελέσματα των προσθέσεων εκτυπώνονται στην οθόνη. Αναλυτικά, εκτυπώνονται τα παρακάτω:

12
5.85

Αυτός είναι ο τρόπος με τον οποίο ο κώδικας πραγματοποιεί προσθήκες ακεραίων και πραγματικών αριθμών και εμφανίζει τα αποτελέσματα.

[adinserter block=”2″]

Στο παρακάτω παράδειγμα, χρησιμοποιούμε υπερφόρτωση συνάρτησης για να λειτουργήσει η συνάρτηση για int και double τύπους δεδομένων:

#include <iostream>

// Συνάρτηση για εκτύπωση ακεραίων αριθμών
void printNumber(int x) {
  std::cout << "The integer is: " << x << std::endl;
}

// Συνάρτηση για εκτύπωση δεκαδικών αριθμών
void printNumber(double x) {
  std::cout << "The double is: " << x << std::endl;
}

int main() {
  int a = 5;
  double b = 3.14;

  printNumber(a); // Κλήση της συνάρτησης printNumber με ακέραιο όρισμα
  printNumber(b); // Κλήση της συνάρτησης printNumber με δεκαδικό όρισμα

  return 0;
}

Ο παραπάνω κώδικας πραγματοποιεί τις παρακάτω ενέργειες:

  1. Συμπεριλαμβάνει τη βιβλιοθήκη iostream, που περιέχει τις δυνατότητες εισόδου/εξόδου στην κονσόλα.
  2. Δηλώνει δύο συναρτήσεις με τα ονόματα printNumber, μία για εκτύπωση ακεραίων αριθμών και μία για εκτύπωση δεκαδικών αριθμών. Οι συναρτήσεις χρησιμοποιούν το αντικείμενο std::cout για να εκτυπώσουν τα μηνύματα και τις τιμές στην οθόνη.
  3. Η συνάρτηση main αρχίζει εκτελώντας τον κώδικα μέσα σε αυτήν. Δηλώνει μια μεταβλητή a τύπου int με τιμή 5 και μια μεταβλητή b τύπου double με τιμή 3.14.
  4. Καλεί τη συνάρτηση printNumber δύο φορές, πρώτα με όρισμα τη μεταβλητή a (τύπου int) και μετά με όρισμα τη μεταβλητή b (τύπου double). Ο κώδικας εσωτερικά αναγνωρίζει ποια έκδοση της συνάρτησης printNumber να καλέσει, ανάλογα με τον τύπο του ορίσματος που περνά.
  5. Επιστρέφει την τιμή 0, που υποδηλώνει επιτυχή ολοκλήρωση του προγράμματος, στην εντολή return 0;.

Συνολικά, ο κώδικας εκτυπώνει στην οθόνη το μήνυμα “The integer is: 5” και “The double is: 3.14”, χρησιμοποιώντας τις δύο διαφορετικές συναρτήσεις printNumber ανάλογα με τον τύπο των ορισμάτων που περνά σε αυτές.

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

Η αναδρομή μπορεί να φαίνεται αρχικά δύσκολη στην κατανόηση. Ο καλύτερος τρόπος για να κατανοήσετε πώς λειτουργεί είναι να την πειραματιστείτε, δηλαδή να την εφαρμόσετε και να την εξερευνήσετε σε πρακτικά παραδείγματα.

Ας δούμε ένα παράδειγμα αναδρομής στην C++ που υπολογίζει τον αριθμό Fibonacci για έναν δεδομένο αριθμό:

#include <iostream>

// Συνάρτηση για τον υπολογισμό των αριθμών Fibonacci
int fibonacci(int n) {
  if (n <= 1) { // Αν ο αριθμός είναι 0 ή 1
    return n; // Επιστρέφουμε τον ίδιο τον αριθμό
  }
  // Αναδρομικά υπολογίζουμε τον αριθμό Fibonacci
  return fibonacci(n-1) + fibonacci(n-2);
}

int main() {
  int num = 10; // Ο αριθμός Fibonacci που θέλουμε να υπολογίσουμε
  std::cout << "The Fibonacci series for " << num << " numbers are:" << std::endl;

  // Εκτύπωση της ακολουθίας Fibonacci
  for (int i = 0; i < num; i++) {
    std::cout << fibonacci(i) << " "; // Εκτύπωση του i-οστού αριθμού Fibonacci
  }
  std::cout << std::endl;

  return 0;
}

Ο παραπάνω κώδικας υπολογίζει και εκτυπώνει την ακολουθία Fibonacci για έναν δεδομένο αριθμό num. Ας αναλύσουμε τον κώδικα αναλυτικά:

  1. Η συνάρτηση fibonacci υπολογίζει αναδρομικά τους αριθμούς Fibonacci. Αν ο αριθμός n είναι μικρότερος ή ίσος με 1, επιστρέφεται ο ίδιος ο αριθμός. Διαφορετικά, υπολογίζεται ο αριθμός Fibonacci του n-1 και n-2 μέσω αναδρομικής κλήσης της ίδιας της συνάρτησης και επιστρέφεται ο αθροισμός των δύο αυτών αριθμών.
  2. Στην main συνάρτηση, ορίζεται ο αριθμός num που καθορίζει πόσους αριθμούς Fibonacci θα εκτυπωθούν.
  3. Μέσω της εντολής std::cout, εκτυπώνεται το μήνυμα “The Fibonacci series for [num] numbers are:” που αναφέρει πόσους αριθμούς Fibonacci θα εκτυπωθούν.
  4. Ο βρόχος for ξεκινά από το i = 0 και τρέχει μέχρι το i να γίνει μικρότερο από το num. Κατά τη διάρκεια κάθε επανάληψης, εκτυπώνεται ο αριθμός Fibonacci του i με την εντολή std::cout << fibonacci(i) << " ".
  5. Μετά τον τερματισμό του βρόχου, εκτυπώνεται ένας νέος χαρακτήρας για να πραγματοποιηθεί αλλαγή γραμμής.
  1. Η συνάρτηση main επιστρέφει την τιμή 0, υποδηλώνοντας ότι το πρόγραμμα ολοκληρώθηκε επιτυχώς.
26 Ιουνίου, 2023
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων