This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
cpp:functions [2017/04/11 08:56] gthanos [Υπερφόρτωση συναρτήσεων] |
cpp:functions [2021/04/27 06:43] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Συναρτήσεις ή μέθοδοι ====== | ||
| - | |||
| - | Στη C++ οι μέθοδοι συνηθίζεται να καλούνται συναρτήσεις. Η συγκεκριμένη ονοματολογία προέρχεται ως κληρονομιά από την γλώσσα C. Η βασική διαφορά σε σχέση με την Java είναι ότι μπορείτε να ορίσετε συναρτήσεις οι οποίες δεν ανήκουν σε κλάσεις, | ||
| - | <code c++> | ||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | int addition (int a, int b) { return a+b; } | ||
| - | |||
| - | int main () { | ||
| - | int x=5; | ||
| - | x = 5 + addition(8, | ||
| - | cout << "x: " << x << endl; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ====== Η επιστρεφόμενη τιμή της συνάρτησης main ====== | ||
| - | |||
| - | ===== Κλήση με τιμή και κλήση με αναφορά ===== | ||
| - | |||
| - | Κατά την κλήση μίας συνάρτησης οι παράμετροι της συνάρτησης αντιγράφονται στο stack πριν από την εκτέλεσης της. Μετά την ολοκλήρωση εκτέλεσης οι παράμετροι διαγράφονται από το stack και οποιαδηποτε αλλαγές έγιναν στις παραμέτρους κατά τη κλήσης της συνάρτησης είναι αδύνατο να διατηρηθούν μετά την κλήση της | ||
| - | |||
| - | Εάν θέλουμε οι αλλαγές στα ορίσματα της συνάρτησης να διατηρηθούν και μετά την κλήση της θα πρέπει να περάσουμε τις διευθύνσεις των εμπλεκόμενων μεταβλητών και όχι τις μεταβλητές αυτές καθ' | ||
| - | |||
| - | <code c++ powerOf2.cpp> | ||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | int powerOf2(int x) { | ||
| - | x = x*x; | ||
| - | return x; | ||
| - | } | ||
| - | |||
| - | int powerOf2Ref(int &x) { | ||
| - | x = x*x; | ||
| - | return x; | ||
| - | } | ||
| - | |||
| - | int powerOf2Ptr(int *x) { | ||
| - | *x = (*x)*(*x); | ||
| - | return *x; | ||
| - | } | ||
| - | |||
| - | int main() { | ||
| - | int a = 5, b; | ||
| - | b = powerOf2(a); | ||
| - | cout << "a: " << a <<", | ||
| - | a = 5; | ||
| - | b = powerOf2Ref(a); | ||
| - | cout << "a: " << a <<", | ||
| - | a = 5; | ||
| - | b = powerOf2Ptr(& | ||
| - | cout << "a: " << a <<", | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Το αποτέλεσμα της εκτέλεσης του παραπάνω προγράμματος έχει ως εξής: | ||
| - | < | ||
| - | a: 5, b: 25 | ||
| - | a: 25, b: 25 | ||
| - | a: 25, b: 25 | ||
| - | </ | ||
| - | |||
| - | Παρατηρήστε ότι μετά την έξοδο από τις μεθόδους // | ||
| - | |||
| - | ===== Υπερφόρτωση συναρτήσεων ===== | ||
| - | |||
| - | Η C++ (όπως και η Java) επιτρέπει δύο συναρτήσεις να έχουν το ίδιο όνομα αλλά διαφορετικό αριθμό ή τύπο παραμέτρων. Αυτό συμβαίνει διότι η συνάρτηση δεν ορίζεται μόνο από το όνομα της, αλλά από το όνομα της σε συνδυασμό με τις τυπικές παραμέτρους που λαμβάνει. Δείτε το προηγούμενο παράδειγμα προσαρμοσμένο, | ||
| - | |||
| - | <code c++ powerOf2.cpp> | ||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | int powerOf2(int &x) { | ||
| - | x = x*x; | ||
| - | return x; | ||
| - | } | ||
| - | |||
| - | int powerOf2(int *x) { | ||
| - | *x = (*x)*(*x); | ||
| - | return *x; | ||
| - | } | ||
| - | |||
| - | double powerOf2(double *x) { | ||
| - | *x = (*x)*(*x); | ||
| - | return *x; | ||
| - | } | ||
| - | |||
| - | int main() { | ||
| - | int a = 5, b; | ||
| - | double d = 5.0, e; | ||
| - | b = powerOf2(a); | ||
| - | cout << "a: " << a <<", | ||
| - | a = 5; | ||
| - | b = powerOf2(& | ||
| - | cout << "a: " << a <<", | ||
| - | e = powerOf2(& | ||
| - | cout << "d: " << d <<", | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Παρατηρήστε ότι οι συνάρτηση // | ||
| - | ===== Template functions ===== | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||