Συναρτήσεις
Μια συνάρτηση αποτελείται από ένα σετ εντολών οι οποίες εκτελούνται όταν η συνάρτηση κληθεί.
Η συνάρτηση αποτελεί τον δομικό λίθο μιας εφαρμογής γραμμένης σε C ή C++.
Μια εφαρμογή μπορεί να περιέχει μία ή περισσότερες συναρτήσεις.
Κάθε εφαρμογή περιέχει υποχρεωτικά τη συνάρτηση main()
.
Κάθε συνάρτηση (στην εφαρμογή που ανήκει) πρέπει να φέρει ένα συγκεκριμένο και μοναδικό όνομα (π.χ.: myWallet
).
Σχετικά με την ονοματολογία των συναρτήσεων ισχύει ότι και για τις μεταβλητές.
Κάθε όνομα συνάρτησης ακολουθείται από ένα ζεύγος παρενθέσεων (π.χ.: myWallet()
).
Το σετ των εντολών κάθε συνάρτησης περιέχεται στα άγκιστρα {
και }
. (π.χ.: myWallet() { . . . }
).
Μια συνάρτηση μπορεί να έχει παραμέτρους οι οποίες δηλώνονται μέσα στις παρενθέσεις και οι οποίες χωρίζονται με ένα κόμμα αν είναι πολλές (π.χ.: myWallet(int x, char type) { . . . }
).
Αν η συνάρτηση δεν επιστρέφει ένα αποτέλεσμα τότε χαρακτηρίζεται ως void
και γράφουμε:
void myWallet(int x, char type) { ... ... }
Αν η συνάρτηση επιστρέφει ένα αποτέλεσμα τότε προσδιορίζουμε τον τύπο δεδομένων που επιστρέφει (έστω int) και γράφουμε:
int myWallet(int x, char type) { int i; ... i = 100; ... return i; }
Στην περίπτωση αυτή θα πρέπει να υπάρχει η εντολή return i;
(όπου i η τιμή) μέσα στη συνάρτηση η οποία επιστρέφει την τιμή.
Μια συνάρτηση μπορεί να έχει τις δικές της (τοπικές) μεταβλητές.
Όταν καλείτε μια συνάρτηση πρέπει να "περνάτε" και τα αντίστοιχα ορίσματα π.χ.: myWallet(100, 'w');
Όταν καλείτε μια συνάρτηση η οποία επιστρέφει κάποια τιμή, τότε αυτή την αποθηκεύουμε συνήθως σε μια μεταβλητή ίδιου τύπου π.χ.: int wallet = myWallet(100, 'w');
#include <iostream> using namespace std; int getMax(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; } int main() { int a = 100; int b = 200; int result; result = getMax(a, b); cout << "Max value is: " << result; return 0; }
Max value is : 200
Δήλωση και υλοποίηση συνάρτησης
Σε εφαρμογές μεγάλης κλίμακας οι δηλώσεις και υλοποιήσεις των συναρτήσεων γίνονται ξεχωριστά.
Στη δήλωση καταχωρείται η συνάρτηση μόνο χωρίς το σώμα.
#include <iostream> using namespace std; int getMax(int num1, int num2); int main() { int a = 100; int b = 200; int result; result = getMax(a, b); cout << "Max value is: " << result; return 0; } int getMax(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; }
Max value is : 200
Παράμετροι και ορίσματα
Όταν δηλώνεται μια συνάρτηση ορίζονται και οι παράμετροι μέσα στις παρενθέσεις. Όταν καλείται μια συνάρτηση στέλνονται τα ορίσματα (οι τιμές) που θα ορίσουν τις τιμές των παραμέτρων.
#include <iostream> using namespace std; void test(int i, char c) { cout << "the value for i is " << i << endl; cout << "the value for c is " << c << endl; } int main() { test(100, 'A'); test(200, 'B'); return 0; }
the value for i is 100 the value for c is A the value for i is 200 the value for c is B
Κλήση συναρτήσεων
Κάθε συνάρτηση (έστω τελική) καλείται από κάποια άλλη συνάρτηση (έστω αρχική) και όταν η τελική κληθεί θα εκτελέσει τον κώδικά της και θα επιστρέψει ένα αποτέλεσμα στην αρχική.
Η συνάρτηση main είναι αυτή που πρώτα καλεί αλλά δεν καλείται από καμία άλλη.
Στη συνέχεια παρουσιάζονται μερικά από τα σενάρια κλήσεων μεταξύ ενός αριθμού συναρτήσεων.
Εδώ η main καλεί την Α και επιστρέφει στην main.
Εδώ η main καλεί την A η οποία στη συνέχεια καλεί την B και επιστρέφει στην A. Τέλος, η A επιστρέφει στην main.
Εδώ η main καλεί την Α η οποία στη συνέχεια καλεί την B και επιστρέφει στην A. Στη συνέχεια η Α καλεί την C και τέλος η Α επιστρέφει στην main.
Προκαθορισμένες τιμές παραμέτρων (Default Parameter Values)
Σε μία ή περισσότερες παραμέτρους μιας συνάρτησης μπορούμε να έχουμε προκαθορισμένες τιμές.
Έτσι, αν καλέσουμε τη συνάρτηση χωρίς όρισμα η τιμή της παραμέτρου θεωρείται η προκαθοσριμένη.
void printFavoriteCity(string city = "Athens") { cout << "My favorite city is: " << city << endl; }
Αν καλέσω τη συνάρτηση όπως παρακάτω:
printFavoriteCity("Thessaloniki"); printFavoriteCity();
Το αποτέλεσμα θα είναι:
My favorite city is: Thessaloniki My favorite city is: Athens
Πέρασμα μεταβλητών με αναφορά (Pass By Reference)
Στην περίπτωση αυτή η αλλαγή τιμών που θα γίνει στις παραμέτρους των συναρτήσεων θα αναφέρεται στην αρχική μεταβλητή με την οποιά κλήθηκε η συνάρτηση.
Για να έχουμε πέρασμα μεταβλητών με αναφορά, θα πρέπει να προηγείται στο όνομα της παραμέτρου το σύμβολο &
.
void setOpposite(int &number) { number = -number; }
Αν καλέσω τη συνάρτηση όπως παρακάτω:
int x = 100; cout << x << endl; setOpposite(x); cout << x << endl;
Το αποτέλεσμα θα είναι:
100 -100
Πέρασμα μεταβλητών με τιμή (Pass By value)
Στην περίπτωση αυτή η αλλαγή τιμών που θα γίνει στις παραμέτρους των συναρτήσεων δεν θα επηρεάσει την αρχική μεταβλητή με την οποιά κλήθηκε η συνάρτηση.
void setOpposite(int number) { number = -number; }
Αν καλέσω τη συνάρτηση όπως παρακάτω:
int x = 100; cout << x << endl; setOpposite(x); cout << x << endl;
Το αποτέλεσμα θα είναι:
100 100
Η προκαθορισμένη επιλογή είναι η by value για όλους τους τύπους μεταβλητών. Εξαίρεση υπάρχει για τους πίνακες όπου η επιλογή είναι by reference.
Δείτε: Πίνακες.
callback συναρτήσεις (συναρτήσεις επανάκλησης)
Μια συνάρτηση επανάκλησης είναι μια συνάρτηση που μεταβιβάζεται ως όρισμα σε μια άλλη συνάρτηση και στη συνέχεια καλείται εντός αυτής της συνάρτησης. Αυτό σας επιτρέπει να γράψετε πιο ευέλικτο και επαναχρησιμοποιήσιμο κώδικα, καθώς μπορείτε να περάσετε διαφορετικές λειτουργίες για να επιτύχετε διαφορετικά αποτελέσματα. Οι λειτουργίες επανάκλησης χρησιμοποιούνται συνήθως στον προγραμματισμό που βασίζεται σε συμβάντα, όπου θέλετε να εκτελέσετε κάποια ενέργεια όταν συμβαίνει ένα συγκεκριμένο συμβάν.
#include <iostream> using namespace std; void hello(void (*callback)()) { (*callback)(); } void fun() { printf("This is fun "); } int main() { hello(&fun); cout << "\nend of program" << endl; return 0; }