Διαφορά μεταξύ Call by Value και Call by Reference
Βασική διαφορά μεταξύ Call by Value και Call by Reference
- Στη μέθοδο Call by value, η αρχική τιμή δεν τροποποιείται, ενώ στη μέθοδο Call by reference, η αρχική τιμή τροποποιείται.
- Στο Call by value, μεταβιβάζεται ένα αντίγραφο της μεταβλητής, ενώ στο Call by reference, μεταβιβάζεται μια ίδια η μεταβλητή.
- Στο Call by value, τα πραγματικά και επίσημα ορίσματα θα δημιουργηθούν σε διαφορετικές θέσεις μνήμης, ενώ στο Call by reference, τα πραγματικά και επίσημα ορίσματα θα δημιουργηθούν στην ίδια θέση μνήμης.
- Η κλήση κατά τιμή είναι η προεπιλεγμένη μέθοδος σε γλώσσες προγραμματισμού όπως C++, PHP, Visual Basic NET και C#, ενώ η κλήση μέσω αναφοράς υποστηρίζεται μόνο σε Java Γλώσσα.
- Οι μεταβλητές Call by Value μεταβιβάζονται χρησιμοποιώντας μια απλή μέθοδο, ενώ οι δείκτες Call by Reference απαιτούνται για την αποθήκευση της διεύθυνσης των μεταβλητών.
Στις γλώσσες προγραμματισμού, οι συναρτήσεις μπορούν να καλούνται με δύο τρόπους: ο οποίος είναι γνωστός ως Call by Value και Call by Reference.
Τι είναι η μέθοδος Call by Value;
Η μέθοδος Call by value αντιγράφει την τιμή ενός ορίσματος στην επίσημη παράμετρο αυτής της συνάρτησης. Επομένως, οι αλλαγές που έγιναν στην παράμετρο της κύριας συνάρτησης δεν επηρεάζουν το όρισμα.
Σε αυτήν τη μέθοδο μετάδοσης παραμέτρων, οι τιμές των πραγματικών παραμέτρων αντιγράφονται στις επίσημες παραμέτρους της συνάρτησης και οι παράμετροι αποθηκεύονται σε διαφορετικές θέσεις μνήμης. Έτσι, τυχόν αλλαγές που γίνονται μέσα στις λειτουργίες δεν αντικατοπτρίζονται στις πραγματικές παραμέτρους του καλούντος.
Τι είναι η μέθοδος Call by Reference;
Η μέθοδος κλήσης με αναφορά αντιγράφει τη διεύθυνση ενός ορίσματος στην επίσημη παράμετρο. Σε αυτή τη μέθοδο, η διεύθυνση χρησιμοποιείται για πρόσβαση στο πραγματικό όρισμα που χρησιμοποιείται στην κλήση συνάρτησης. Σημαίνει ότι οι αλλαγές που γίνονται στην παράμετρο αλλάζουν το όρισμα μεταβίβασης.
Σε αυτή τη μέθοδο, η εκχώρηση μνήμης είναι ίδια με τις πραγματικές παραμέτρους. Όλες οι λειτουργίες στη συνάρτηση εκτελούνται στην τιμή που είναι αποθηκευμένη στη διεύθυνση της πραγματικής παραμέτρου και η τροποποιημένη τιμή θα αποθηκευτεί στην ίδια διεύθυνση.
Παράδειγμα Κωδικού C μιας μεθόδου Call by Value
void main() { int a = 10, void increment(int); Cout << "before function calling" << a; increment(a); Cout << "after function calling" << a; getch(); void increment(int x) { int x = x + 1; Cout << "value is" << x; }
Παραγωγή:
before function calling 10 value is 11 after function calling 1-0
Επειδή η μεταβλητή που δηλώνεται 'a'in main() είναι διαφορετική από τη μεταβλητή 'x' σε increment(). Σε αυτό το πρόγραμμα μόνο τα ονόματα μεταβλητών είναι παρόμοια, αλλά η διεύθυνση μνήμης τους είναι διαφορετική και αποθηκεύεται σε διαφορετικές θέσεις μνήμης.
Java Παράδειγμα κώδικα μιας μεθόδου κλήσης με αναφορά
Public static void main(string args[]) { int a = 10; System.out.println("Before call Value of a = ", a); Void increment(); System.out.println("After call Value of a = ", a); } Void increment(int x) { int x = x + 1; }
Παραγωγή:
Before call Value of a =10 After call Value of a =11
Επειδή η μεταβλητή που δηλώνεται 'a' στο αναφέρεται/ δείχνει στη μεταβλητή 'a' στο main(). Εδώ το όνομα της μεταβλητής είναι διαφορετικό, αλλά και οι δύο δείχνουν/αναφέρουν τις ίδιες θέσεις διεύθυνσης μνήμης.
Call by Value vs. Call by Reference
παράμετροι | Κλήση ανά αξία | Καλέστε με αναφορά |
---|---|---|
Ορισμός | Κατά την κλήση μιας συνάρτησης, όταν μεταβιβάζετε τιμές αντιγράφοντας μεταβλητές, αυτή είναι γνωστή ως "Κλήση κατά τιμές". | Κατά την κλήση μιας συνάρτησης, στη γλώσσα προγραμματισμού αντί της αντιγραφής των τιμών των μεταβλητών, χρησιμοποιείται η διεύθυνση των μεταβλητών και είναι γνωστή ως «Κλήση με αναφορές. |
Επιχειρήματα | Σε αυτή τη μέθοδο, μεταβιβάζεται ένα αντίγραφο της μεταβλητής. | Σε αυτή τη μέθοδο, μεταβιβάζεται μια ίδια η μεταβλητή. |
Αποτέλεσμα | Οι αλλαγές που γίνονται σε ένα αντίγραφο της μεταβλητής δεν τροποποιούν ποτέ την τιμή της μεταβλητής εκτός της συνάρτησης. | Η αλλαγή στη μεταβλητή επηρεάζει επίσης την τιμή της μεταβλητής εκτός της συνάρτησης. |
Αλλαγή αξίας | Δεν σας επιτρέπει να κάνετε αλλαγές στις πραγματικές μεταβλητές. | Σας επιτρέπει να κάνετε αλλαγές στις τιμές των μεταβλητών χρησιμοποιώντας κλήσεις συναρτήσεων. |
Πέρασμα μεταβλητής | Οι τιμές των μεταβλητών μεταβιβάζονται χρησιμοποιώντας μια απλή μέθοδο. | Απαιτούνται μεταβλητές δείκτη για την αποθήκευση της διεύθυνσης των μεταβλητών. |
Τροποποίηση αξίας | Η αρχική τιμή δεν τροποποιήθηκε. | Η αρχική τιμή τροποποιείται. |
Τοποθεσία μνήμης | Πραγματικά και επίσημα επιχειρήματα θα δημιουργηθεί σε διαφορετικά θέση μνήμης |
Πραγματικά και επίσημα επιχειρήματα θα δημιουργηθεί στο ίδιο θέση μνήμης |
Ασφάλεια | Τα πραγματικά επιχειρήματα παραμένουν ασφαλείς καθώς δεν μπορούν να τροποποιηθούν κατά λάθος. |
Τα πραγματικά επιχειρήματα δεν είναι Ασφαλής. Μπορεί να είναι τροποποιήθηκε κατά λάθος, επομένως πρέπει να χειρίζεστε προσεκτικά τις λειτουργίες των ορισμάτων. |
Προεπιλογή | Προεπιλογή σε πολλούς προγραμματισμούς γλώσσες όπως C++.PHP. Visual Basic NET και C#. |
Υποστηρίζεται από τους περισσότερους γλώσσες προγραμματισμού όπως η JAVA, αλλά όχι ως προεπιλογή. |
Πλεονεκτήματα της χρήσης της μεθόδου Call by value στο C
Πλεονεκτήματα/πλεονεκτήματα μιας κλήσης κατά τιμή σε C:
- Η μέθοδος δεν αλλάζει την αρχική μεταβλητή, επομένως διατηρεί δεδομένα.
- Όποτε καλείται μια συνάρτηση, μην επηρεάζετε ποτέ το πραγματικό περιεχόμενο των πραγματικών ορισμάτων.
- Η αξία των πραγματικών επιχειρημάτων μεταβιβάστηκε στα επίσημα επιχειρήματα, επομένως τυχόν αλλαγές που πραγματοποιούνται στο επίσημο όρισμα δεν επηρεάζουν τις πραγματικές περιπτώσεις.
Πλεονεκτήματα της χρήσης της μεθόδου Call by reference
Πλεονεκτήματα της χρήσης της μεθόδου κλήσης με αναφορά:
- Η συνάρτηση μπορεί να αλλάξει την τιμή του ορίσματος, κάτι που είναι αρκετά χρήσιμο.
- Δεν δημιουργεί διπλά δεδομένα για τη διατήρηση μιας μόνο τιμής που σας βοηθά να εξοικονομήσετε χώρο στη μνήμη.
- Σε αυτή τη μέθοδο, δεν υπάρχει αντίγραφο του επιχειρήματος. Επομένως επεξεργάζεται πολύ γρήγορα.
- Σας βοηθά να αποφύγετε αλλαγές που γίνονται κατά λάθος
- Ένα άτομο που διαβάζει τον κωδικό δεν γνωρίζει ποτέ ότι η τιμή μπορεί να τροποποιηθεί στη συνάρτηση.
Μειονεκτήματα της χρήσης της μεθόδου Call by value
Ακολουθούν τα κύρια μειονεκτήματα/μειονεκτήματα μιας μεθόδου κλήσης κατά τιμή:
- Οι αλλαγές στις πραγματικές παραμέτρους μπορούν επίσης να τροποποιήσουν τις αντίστοιχες μεταβλητές ορίσματος
- Σε αυτή τη μέθοδο, τα ορίσματα πρέπει να είναι μεταβλητές.
- Δεν μπορείτε να αλλάξετε απευθείας μια μεταβλητή σε ένα σώμα συνάρτησης.
- Κάποια στιγμή το όρισμα μπορεί να είναι σύνθετες εκφράσεις
- Υπάρχουν δύο αντίγραφα που δημιουργήθηκαν για την ίδια μεταβλητή που δεν είναι αποδοτική στη μνήμη.
Μειονεκτήματα της χρήσης της μεθόδου κλήσης με αναφορά
Ακολουθούν τα κύρια μειονεκτήματα της χρήσης της μεθόδου κλήσης με αναφορά:
- Ισχυρή μη μηδενική εγγύηση. Μια συνάρτηση που λαμβάνει μια αναφορά πρέπει να βεβαιωθεί ότι η είσοδος δεν είναι μηδενική. Επομένως, δεν χρειάζεται να γίνει μηδενικός έλεγχος.
- Το πέρασμα με αναφορά κάνει τη συνάρτηση να μην είναι καθαρή θεωρητικά.
- Η εγγύηση εφ' όρου ζωής είναι ένα μεγάλο ζήτημα με τις αναφορές. Αυτό είναι ιδιαίτερα επικίνδυνο όταν εργάζεστε με λάμδα και προγράμματα πολλαπλών νημάτων.