cpp:functions

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
cpp:functions [2017/05/06 08:45]
gthanos [Κλήση με τιμή και κλήση με αναφορά]
cpp:functions [2021/04/27 07:29]
gthanos [Κλήση με τιμή και κλήση με αναφορά]
Line 32: Line 32:
 Κατά τον ορισμό μίας συνάρτησης είναι δυνατόν να ορίσετε προκαθορισμένες τιμές για συγκεκριμένες παραμέτρους. Με αυτό τον τρόπο η ίδια μέθοδος μπορεί να κληθεί με λιγότερα ορίσματα, τόσα όσα και οι παράμετροι που έχουν προκαθορισμένες τιμές. Στο παρακάτω παράδειγμα, η μέθοδος powerOf ορίζεται ώστε ο εκθέτης ύψωσης σε δύναμη να έχει την προκαθορισμένη τιμή 2. Στη συνέχει καλείται η συνάρτηση με ένα ή δύο ορίσματα. Κατά τον ορισμό μίας συνάρτησης είναι δυνατόν να ορίσετε προκαθορισμένες τιμές για συγκεκριμένες παραμέτρους. Με αυτό τον τρόπο η ίδια μέθοδος μπορεί να κληθεί με λιγότερα ορίσματα, τόσα όσα και οι παράμετροι που έχουν προκαθορισμένες τιμές. Στο παρακάτω παράδειγμα, η μέθοδος powerOf ορίζεται ώστε ο εκθέτης ύψωσης σε δύναμη να έχει την προκαθορισμένη τιμή 2. Στη συνέχει καλείται η συνάρτηση με ένα ή δύο ορίσματα.
  
-<code c++ powerOf.cpp>+<code c++ power_of.cpp>
 #include <iostream> #include <iostream>
 using namespace std; using namespace std;
Line 39: Line 39:
   if(e==0)   if(e==0)
     return 1;     return 1;
 +  int result = base;
   for(int i=1; i<e; i++) {   for(int i=1; i<e; i++) {
-    base = base * base;+    result *base;
   }   }
-  return base;+  return result;
 } }
  
 int main() { int main() {
-  int a = 5, b;+  int a = 2, b;
   b = powerOf(a);   b = powerOf(a);
   cout << "a: " << a <<", b: " << b << endl;   cout << "a: " << a <<", b: " << b << endl;
-  b = powerOf(a,3);+  b = powerOf(a, 3); 
 +  cout << "a: " << a <<", b: " << b << endl; 
 +  b = powerOf(a, 5);
   cout << "a: " << a <<", b: " << b << endl;   cout << "a: " << a <<", b: " << b << endl;
 } }
Line 124: Line 127:
  
 Παρατηρήστε ότι μετά την έξοδο από τις μεθόδους //powerOf2Ref// και //powerOf2Ptr// η μεταβλητή ''a'' έχει αλλάξει τιμή κάτι που δεν ισχύει μετά την έξοδο από την //powerOf2//. Παρατηρήστε ότι μετά την έξοδο από τις μεθόδους //powerOf2Ref// και //powerOf2Ptr// η μεταβλητή ''a'' έχει αλλάξει τιμή κάτι που δεν ισχύει μετά την έξοδο από την //powerOf2//.
 +
 +<WRAP center round info 80%>
 +Κατά την κλήση μίας συνάρτησης, όταν θέλουμε να περάσουμε αντικείμενα που περιέχουν μεγάλο όγκο πληροφορίας είναι προτιμότερο να τα περάσουμε με αναφορά ακόμη και εάν δεν επιθυμούμε οι πιθανές αλλαγές στις τυπικές παραμέτρους να είναι ορατές μετά την κλήση της συνάρτησης. Ο λόγος είναι ότι η κλήση με αναφορά έχει σταθερό κόστος αντιγραφής ισοδύναμο με το μήκος μίας διεύθυνσης μνήμης, ενώ η αντιγραφή ενός μεγάλου αντικειμένου έχει κόστος όσο το μέγεθος του αντικειμένου. 
 +
 +Για τους βασικούς τύπους δεδομένων η κλήση με αναφορά σε σχέση με την κλήση με τιμή δεν βελτιώνει την ταχύτητα εκτέλεσης του προγράμματος.
 +</WRAP>
  
 ===== Υπερφόρτωση συναρτήσεων ===== ===== Υπερφόρτωση συναρτήσεων =====
Line 161: Line 170:
 </code> </code>
  
-Παρατηρήστε ότι οι συνάρτηση //powerOf2// έχει τρεις διαφορετικές εκδόσεις: μία που λαμβάνει αναφορά σε ακέραιο, μία που λαμβάνει δείκτη σε ακέραιο και μία που λαμβάνει δείκτη σε //double//. Η διάκριση μεταξύ συναρτήσεων με το ίδιο όνομα γίνεται με βάση τη σειρά και τον τύπο των τυπικών παραμέτρων τους. 
  
-<WRAP center round info 80%> 
-Όταν θέλουμε να περάσουμε σε μία συνάρτηση μεγάλα αντικείμενα που περιέχουν πολύ πληροφορία είναι προτιμότερο να τα περάσουμε με αναφορά ακόμη και εάν δεν επιθυμούμε οι πιθανές αλλαγές στις τυπικές παραμέτρους να είναι ορατές μετά την κλήση της συνάρτησης. Ο λόγος είναι ότι η κλήση με αναφορά έχει σταθερό κόστος αντιγραφής ισοδύναμο με το μήκος μίας διεύθυνσης μνήμης, ενώ η αντιγραφή ενός μεγάλου αντικειμένου έχει κόστος όσο το μέγεθος του αντικειμένου.  
- 
-Για βασικούς τύπους δεδομένων η κλήση με αναφορά δεν έχει καμία επίπτωση στην ταχύτητα εκτέλεσης του προγράμματος. 
-</WRAP> 
  
 ===== Template συναρτήσεων ===== ===== Template συναρτήσεων =====
Line 186: Line 189:
 </code> </code>
  
-η δεσμευμένη λέξη //class// (''<class T>'') μπορεί να αντικατασταθεί από την επίσης δεσμευμένη λέξη //typename//. Προκειμένου να κάνετε χρήση ενός template συνάρτησης θα πρέπει κατά την κλήση να ορίσετε και τον τύπο των δεδομένων για τον οποίο καλείται τη συγκεκριμένη συνάρτηση ως εξής:+η δεσμευμένη έκφραση ''template <class T>'') μπορεί να αντικατασταθεί από την επίσης δεσμευμένη έκφραση ''template <typename T>''. Προκειμένου να κάνετε χρήση ενός template συνάρτησης θα πρέπει κατά την κλήση να ορίσετε και τον τύπο των δεδομένων για τον οποίο καλείται τη συγκεκριμένη συνάρτηση ως εξής:
  
 <code c++> <code c++>
Line 192: Line 195:
 </code> </code>
  
-Δείτε το παραπάνω παράδειγμα που περιέχει επιμέρους κλήσεις για την //template// μέθοδο sum.+Δείτε το παραπάνω παράδειγμα που περιέχει επιμέρους κλήσεις για τη μέθοδο sum.
  
-<code sumUsage.cpp>+<code cpp sumUsage.cpp>
 #include <iostream> #include <iostream>
 using namespace std; using namespace std;
cpp/functions.txt · Last modified: 2021/04/27 06:43 (external edit)