6 #.Μάθημα Προγραμματισμού με τη C++ Υπερφόρτωση συναρτήσεων


 
Υπερφόρτωση συναρτήσεων
Η επικεφαλίδα μιας συνάρτησης αποτελείται από το όνομα και τα ορίσματα της συνάρτησης. Η C++ επιτρέπει τη δημιουργία συναρτήσεων εφόσον έχουν διαφορετική επικεφαλίδα. Δηλαδή κάποιες συναρτήσεις μπορεί να έχουν το ίδιο όνομα αλλά να διαφέρουν στον αριθμό των ορισμάτων ή στον τύπο δεδομένων αυτών. Αυτό λέγεται υπερφόρτωση συναρτήσεων.
Στο επόμενο παράδειγμα ορίζουμε δύο συναρτήσεις που έχουν το ίδιο όνομα αλλά διαφορετικό αριθμό ορισμάτων:
void typechar ( char ch )
{
 for (int i=0; i<20; i++)
 cout << ch; //Εκτύπωση του χαρακτήρα ch 20 φορές
 cout << endl;
}

void typechar ( char ch , int n )
{
 for (int i=0; i<n; i++)
 cout << ch; //Εκτύπωση του χαρακτήρα ch n φορές
 cout << endl;
}
Σε αυτή την περίπτωση όταν μέσα από τη main() καλέσουμε τις συναρτήσεις με το ίδιο όνομα, αλλά με διαφορετικό αριθμό παραμέτρων τότε η C++ μπορεί να καταλάβει ποια συνάρτηση θα καλέσει από τον αριθμό των ορισμάτων:
typechar(‘=’);//θα τυπωθεί 20 φορές το ‘=’
typechar(‘+’,10);//θα τυπωθεί 10 φορές το ‘+’
με την πρώτη εντολή καλείται η πρώτη συνάρτηση που δέχεται ένα όρισμα, ενώ με τη δεύτερη εντολή καλείται η δεύτερη συνάρτηση που
δέχεται δύο ορίσματα.
Σε περίπτωση που έχουμε συναρτήσεις με τον ίδιο αριθμό ορισμάτων αλλά με διαφορετικό τύπο δεδομένων, η C++ μπορεί να καταλάβει ποια συνάρτηση θα καλέσει από τον τύπο δεδομένων των ορισμάτων.
Στο επόμενο παράδειγμα υπάρχουν δύο συναρτήσεις με το ίδιο όνομα, τον ίδιο αριθμό ορισμάτων αλλά με διαφορετικό τύπο δεδομένων αυτών.
void athroisma (int a , int b, int &sum)
{
  sum = a + b;
}
void athroisma (float a , float b, float &sum)
{
  sum = a + b;
}
το ποια από τις δύο θα καλέσει κάθε φορά η C++ εξαρτάται από τον τύπο των δεδομένων των ορισμάτων που περιλαμβάνονται στην κλήση:
main ()
{
int i=3, j=5, sum1;
float x=5.5 , y=7.8, sum2;
athroisma(i,j,sum1);//κλήση 1ης συνάρτησης με                    //ακέραιους
athroisma(x,y,sum2);//κλήση 2ης συνάρτησης με                    //πραγματικούς
}


  Εμβέλεια μεταβλητών
Στο μάθημα των μεταβλητών είχαμε μιλήσει για την εμβέλεια των μεταβλητών. Θυμίζουμε ότι όταν μία μεταβλητή δηλώνεται έξω από οποιαδήποτε συνάρτηση, έξω ακόμα και από τη main(), τότε η μεταβλητή αυτή ονομάζεται γενική (global) και μπορεί να χρησιμοποιηθεί σε οποιαδήποτε τμήμα του προγράμματος.
#include <iostream>
float geniki; //Η μεταβλητή αυτή είναι γενική και

main ()     //μπορούμε να τη χρησιμοποιήσουμε
{          //οπουδήποτε
  …
Όταν μία μεταβλητή δηλώνεται μέσα σε μία συνάρτηση τότε αυτή ονομάζεται τοπική και μπορεί να χρησιμοποιηθεί μόνο μέσα στο σώμα αυτή της συνάρτησης.
#include <iostream>
float athroisma (float x, float y)
{
float sum;  //η μεταβλητή αυτή είναι τοπική και               //μπορούμε
sum = x + y; //να τη χρησιμοποιήσουμε οπουδήποτε
return sum; //μέσα στη συνάρτηση
}
Επίσης όταν μία μεταβλητή δηλώνεται μέσα σε ένα τμήμα ενός κώδικα τότε η μεταβλητή αυτή μπορεί να χρησιμοποιηθεί μόνο μέσα στο τμήμα αυτότου κώδικα. Η εμβέλειά της σταματά με την εκτέλεση των εντολών αυτού του τμήματος.
void typechar ( char ch )
{
for (int i=0; i<20; i++) //η μεταβλητή i υπάρχει
{                       //μόνο μέσα στο βρόχο
  cout << ch;
}
cout << i; //αυτό είναι λάθος η μεταβλητή i
          //δεν υπάρχει πια
}
  Δήλωση της συνάρτησης
Μέχρι τώρα ορίζαμε τις συναρτήσεις, γράφοντας την επικεφαλίδα και το σώμα της συνάρτησης, πριν από την κλήση τους για πρώτη φορά από την main(). Εάν δοκιμάσουμε να ορίσουμε πρώτα τη main() η οποία καλεί μια συνάρτηση που ορίζεται μετά από αυτή, θα λάβουμε ένα μήνυμα σφάλματος. Αυτό γίνεται γιατί όταν θα συναντήσει για πρώτη φορά ο μεταγλωττιστής την κλήση μιας συνάρτησης, θα πρέπει να γνωρίζει τη μορφή αυτής της συνάρτησης ώστε να ξέρει πως θα τη χειριστεί.
Πολλές φορές επιθυμούμε να γράψουμε πρώτα τη κύρια συνάρτηση main() και στη συνέχεια τις συναρτήσεις του προγράμματος. Τότε είμαστε υποχρεωμένοι να δηλώσουμε πριν από την main() τις συναρτήσεις. Η δήλωση μιας συνάρτησης περιλαμβάνει μόνο την επικεφαλίδα αυτής. Δηλαδή τον τύπο δεδομένων που επιστρέφει, το όνομά της και τα ορίσματά της:
void typechar ( char ch ); //Δήλωση συνάρτησης
Όσον αφορά τα ορίσματα της συνάρτησης σε μια δήλωση, είναι υποχρεωτικό να γράψουμε τον τύπο δεδομένων αυτών, αλλά όχι και τα ονόματά τους:
void typechar ( char ); //Δήλωση συνάρτησης
Βοηθάει όμως να συμπεριλαμβάνουμε και τα ονόματα των ορισμάτων, όταν είναι τέτοια που μας βοηθούν να τα ξεχωρίσουμε.

Όταν δηλώσουμε μία συνάρτηση πριν από τη main(), μπορούμε να την ορίσουμε μετά από αυτή. Η δήλωση λειτουργεί ως μια υπενθύμιση προς τον μεταγλωττιστή, λέγοντάς του απλά: «να γνωρίζεις, ότι θα χρησιμοποιήσω μια συνάρτηση που θα έχει αυτή τη μορφή, αλλά θα την ορίσω παρακάτω».
#include <iostream>
void typechar ( char ch ); //Δήλωση συνάρτησης
void main()
{
...
typechar (‘=’); //Κλήση συνάρτησης
...
}

//Ορισμός συνάρτησης μετά τη main()

void typechar ( char ch )
{
for (int i=0; i<20; i++)
cout << ch; //Εκτύπωση του χαρακτήρα ch 20 φορές
cout << endl;
}
όπως βλέπετε στο παραπάνω παράδειγμα, ο μεταγλωττιστής δεν «διαμαρτύρεται» όταν συναντά την κλήση της συνάρτησης typechar() μέσα στο σώμα της main(), γιατί φροντίσαμε να τον «ενημερώσουμε» για την ύπαρξη αυτής της συνάρτησης με τη δήλωση αυτής πριν από την πρώτη χρησιμοποίησή της.

Δείτε όλα το μαθήματα εδώ