Συνιστάται, 2024

Επιλογή Συντάκτη

Διαφορά μεταξύ κλήσης βάσει τιμής και κλήσης με αναφορά

Σε C + + και Java, υπάρχουν δύο τρόποι να καλέσετε μια συνάρτηση ή μια μέθοδο. Το πρώτο είναι "κλήση βάσει τιμής" και το δεύτερο είναι "κλήση με αναφορά". Η μέθοδος κλήσης με βάση την τιμή μεταβιβάζει μόνο την τιμή μιας μεταβλητής στον κώδικα λειτουργίας και εάν υπάρχει κάποια αλλαγή στην τιμή μιας μεταβλητής εντός αυτής της συνάρτησης δεν επηρεάζει την αρχική τιμή αυτής της μεταβλητής. Στη μέθοδο κλήσης με αναφορά, μεταβιβάζουμε την ίδια τη μεταβλητή σε ένα επιχείρημα και η αλλαγή στην τιμή μιας μεταβλητής επηρεάζει επίσης την αρχική τιμή αυτής της μεταβλητής. Η κύρια διαφορά μεταξύ των δύο μεθόδων είναι ότι η μέθοδος κλήσης βάσει τιμής μεταβιβάζει την τιμή μιας μεταβλητής και η κλήση με παραπομπή περνά τη διεύθυνση αυτής της μεταβλητής.

Συγκριτικό διάγραμμα:

Βάση σύγκρισηςCall_By_ValueΑναφορά κλήσης
Βασικός
Αντιγράφηκε ένα αντίγραφο της μεταβλητής.Μια ίδια μεταβλητή έχει περάσει.
ΑποτέλεσμαΗ αλλαγή σε ένα αντίγραφο της μεταβλητής δεν τροποποιεί την αρχική τιμή της μεταβλητής εκτός πλευράς της λειτουργίας.Η μεταβολή της μεταβλητής επηρεάζει επίσης την τιμή της μεταβλητής εκτός της λειτουργίας.
Κλήση παραμέτρωνόνομα_στοιχείου (variable_name1, variable_name2, ....);όνομα_λειτουργίας (& variable_name1, & variable_name2, ....);
// σε περίπτωση αντικειμένου
object.func_name (αντικείμενο);
Παραλαβή παραμέτρωνπληκτρολογήστε function_name (πληκτρολογήστε variable_name1, πληκτρολογήστε variable_name2, ....)
{. . }}
πληκτρολογήστε function_name (πληκτρολογήστε * variable_name1, πληκτρολογήστε * variable_name2, ... ....) {. . }}
// σε περίπτωση αντικειμένου
πληκτρολογήστε όνομα_συνόλου (class_type όνομα_object)
{. . }}
Προεπιλεγμένη κλήσηπρωτεύοντος τύπου περάσουν χρησιμοποιώντας "κλήση κατά αξία".τα αντικείμενα περνούν σιωπηρά χρησιμοποιώντας "κλήση με παραπομπή".

Ορισμός της τιμής κλήσης

Εάν περάσετε έναν πρωταρχικό τύπο δεδομένων (ακέραιος, χαρακτήρας και συμβολοσειρά) σε μια συνάρτηση / μέθοδο, τότε μόνο ο "τιμή" μεταβιβάζεται στον κώδικα λειτουργίας. Η λειτουργία αντιγράφει την τιμή ενός όρου σε μια «τυπική παράμετρο» του κώδικα λειτουργίας. Αν υπάρχει κάποια τροποποίηση στην τυπική παράμετρο σε έναν κώδικα λειτουργίας, δεν θα τροποποιηθεί η αρχική τιμή του επιχειρήματος που χρησιμοποιείται για την κλήση αυτής της συνάρτησης.

Με απλά λόγια, αν μια συνάρτηση / μέθοδος καλείται από την προσέγγιση 'call by value' τότε ένα αντίγραφο της μεταβλητής διαβιβάζεται στον κώδικα λειτουργίας. Εάν ένας κώδικας λειτουργίας κάνει οποιεσδήποτε αλλαγές στην τιμή του αντιγράφου της μεταβλητής, δεν αλλάζει την αρχική τιμή της μεταβλητής.

Ας δούμε ένα παράδειγμα για να το καταλάβουμε σύντομα.

 // παράδειγμα στην τάξη Java check {άκυρη αλλαγή (int i, int j) {i = i * i; j = j / 2; system.out.println ("τιμή της παραμέτρου μέσα στη λειτουργία"); system.out.println ("τιμή του 'i' που δέχεται την τιμή του όρου 'a'" + i); system.out.println ("τιμή του 'j' που δέχεται την τιμή του όρου 'b'" + j); }} τάξη call_by _value {δημόσια static κενό main (συμβολοσειρά args []) {int a = 12, b = 20; ελέγξτε το C = νέο έλεγχο (); system.out.println ("τιμή των 'a' και 'b' πριν την κλήση λειτουργίας" + a + "" + b); C.change (a, b). // κλήση βάσει τιμής. system.out.println ("τιμή των 'a' και 'b' μετά από κλήση λειτουργίας" + a + "" + b); }} // τιμή εξόδου των 'a' και 'b' πριν από την κλήση λειτουργίας 12 20 τιμή της παραμέτρου εντός της τιμής λειτουργίας του 'i' που δέχεται την τιμή της τιμής 'a' 144 του argument 'j' που δέχεται την τιμή του argument 'b' 10 αξία των 'a' και 'b' μετά την κλήση λειτουργίας 12 20 

Ορισμός κλήσης με αναφορά

Η κλήση με τη μέθοδο αναφοράς μεταβιβάζει μια αναφορά / διεύθυνση ενός όρου στον κώδικα λειτουργίας. Καθώς η διεύθυνση ενός επιχειρήματος διαβιβάζεται στον κώδικα λειτουργίας, η τυπική παράμετρος που δέχεται τη διεύθυνση αυτή θα είναι μια μεταβλητή δείκτη. Τώρα, καθώς ο κώδικας λειτουργίας έχει αποκτήσει τη διεύθυνση ενός όρου, η τροποποίηση στην τιμή ενός όρου θα τροποποιήσει επίσης την αρχική τιμή ενός επιχειρήματος.

Σε C + + και Java, είναι πολύ συνηθισμένο να περάσει το αντικείμενο στη συνάρτηση / μέθοδο και το αντικείμενο περνά πάντα από την αναφορά του. Οι αλλαγές που γίνονται στο αντικείμενο εντός της συνάρτησης / μεθόδου επηρεάζουν το αντικείμενο που χρησιμοποιείται για την κλήση αυτής της λειτουργίας / μεθόδου.

Το παρακάτω κομμάτι δείχνει τον σωστό τρόπο για να «καλέσετε με παραπομπή».

 // παράδειγμα σε swap κλάσης C ++ {κενό swap (int * x, int * y) {int temp; temp = x; * χ = * γ; * Υ = θερμοκρασία; }} int κύρια {int a = 10, b = 20; cout << "της τιμής a, b πριν από την κλήση λειτουργίας" << << "" << 

Τώρα ας συζητήσουμε την «κλήση με παραπομπή» περνώντας ένα «αντικείμενο» ως ένα επιχείρημα, το οποίο υιοθετείται εμμέσως από την προσέγγιση «κλήση με παραπομπή».

 Έλεγχος κλάσης {int a, b; ελέγξτε (int x, int b) {// αντικείμενο αρχικοποιημένο μέσω αυτού του δομικού στοιχείου a = x; b = y; } κενό ανταλλαγής (ελέγξτε ob) {ob.a = a * 2; ob.b = b / 2; }} class main_class {public static κενό main (string args []) {check C = νέα επιταγή (20, 40); // αρχικοποίηση αντικειμένου. system.out.println ("τιμή του 'ob.a' και 'ob.b' πριν από την κλήση λειτουργίας" + ob.a + "" + ob.b); Γ. Ανταλλαγή (C); // κλήση με αναφορά. system.out.println ("τιμή του 'ob.a' και 'ob.b' πριν από την κλήση λειτουργίας" + ob.a + "" + ob.b); }} // τιμή εξόδου των 'ob.a' και 'ob.b' πριν από την κλήση λειτουργίας 20 40 τιμή των 'ob.a' και 'ob.b' μετά την κλήση λειτουργίας 40 20 

Βασικές διαφορές μεταξύ της τιμής κλήσης και της αναφοράς κλήσης

  1. Η μεταβίβαση του επιχειρήματος χρησιμοποιώντας την προσέγγιση "κλήση βάσει τιμής" διαβιβάζει μόνο το αντίγραφο αυτής της μεταβλητής, έτσι οι αλλαγές που έγιναν στην τιμή του αντιγράφου αυτής της μεταβλητής δεν επηρεάζουν την αρχική τιμή αυτής της μεταβλητής. Στην προσέγγιση «κλήση με αναφορά» η ίδια η μεταβλητή μεταβιβάζεται ως όρισμα, έτσι οι αλλαγές σε αυτήν τροποποιούν την τιμή της αρχικής μεταβλητής.
  2. Εάν τα επιχειρήματα που περάσαμε είναι πρωτόγονοι τύποι δεδομένων, είναι απλώς 'call by value', αλλά εάν οι αναφορές / διευθύνσεις των παραδειγμάτων ή των αντικειμένων μεταβιβαστούν τότε μια λειτουργία καλείται με τη μέθοδο 'call by reference'.
  3. Στην προσέγγιση «call by value» τα επιχειρήματα που έχουν περάσει είναι μόνο το όνομα των μεταβλητών, ενώ στην προσέγγιση 'call by reference' τα επιχειρήματα που έχουν περάσει είναι το όνομα μεταβλητής κατά μήκος '&' ή ένα αντικείμενο που διαβιβάζεται ακριβώς από το όνομά του.
  4. Η παραλαβή των παραμέτρων του επιχειρήματος στην προσέγγιση 'call by value' είναι το όνομα μεταβλητής μαζί με τον τύπο δεδομένων του. Στην προσέγγιση 'call by reference' η παράμετρος παραλαβής είναι πάντα μια μεταβλητή δείκτη μαζί με τον τύπο δεδομένων και στην περίπτωση του αντικειμένου είναι ένα όνομα αντικειμένου μαζί με τον τύπο κλάσης του.

Συμπέρασμα:

Η C ++ και η Java χρησιμοποιούν και τις δύο προσεγγίσεις ανάλογα με το τι πέρασε. Αν θέλετε να μεταβιβάσετε μόνο την τιμή της προσέγγισης μεταβλητής χρήσης «ανά αξία» και αν θέλετε να δείτε την αλλαγή στην αρχική τιμή της μεταβλητής, χρησιμοποιήστε την προσέγγιση «κλήση με βάση την αναφορά».

Top