Οι αναφορές (references) στη γλώσσα C++ είναι ένα χρήσιμο χαρακτηριστικό που επιτρέπει τη δημιουργία εναλλακτικών ονομάτων (aliases) για υπάρχουσες μεταβλητές ή αντικείμενα. Ουσιαστικά, οι αναφορές είναι απλά επισημάνσεις που δίνονται σε υπάρχοντα αντικείμενα, και δεν αποτελούν αυτόνομες οντότητες όπως οι δείκτες.
Ας δούμε ένα αναλυτικό παράδειγμα χρήσης αναφορών στην C++:
#include <iostream> // Συνάρτηση που αυξάνει την τιμή του αριθμού κατά 1 void increment(int& num) { num++; // Αυξάνει την τιμή του αριθμού κατά 1 } int main() { int number = 10; std::cout << "Αρχική τιμή του αριθμού: " << number << std::endl; increment(number); // Καλείται η συνάρτηση increment με αναφορά στον αριθμό std::cout << "Τελική τιμή του αριθμού: " << number << std::endl; return 0; }
Σε αυτό το παράδειγμα, δημιουργούμε μια συνάρτηση με όνομα increment
, η οποία παίρνει μια αναφορά σε έναν ακέραιο αριθμό. Μέσα στη συνάρτηση, αυξάνουμε την τιμή του αριθμού κατά 1 χρησιμοποιώντας τον τελεστή ++
.
Στην main
, δημιουργούμε μια μεταβλητή με όνομα number
και αρχικοποιούμε την τιμή της σε 10. Έπειτα, καλούμε τη συνάρτηση increment
με αναφορά στη μεταβλητή number
. Αυτό σημαίνει ότι η συνάρτηση θα λειτουργήσει πάνω στην ίδια τη μεταβλητή number
, αντί να αντιγράψει την τιμή της.
Στη συνέχεια, εκτυπώνουμε την τελική τιμή της μεταβλητής number
, η οποία θα έχει αυξηθεί κατά 1 μετά την κλήση της συνάρτησης increment
.
Το αποτέλεσμα που αναμένουμε είναι:
Αρχική τιμή του αριθμού: 10 Τελική τιμή του αριθμού: 11
Αυτό συμβαίνει επειδή η αναφορά που περνάμε στη συνάρτηση increment
επιτρέπει την αλλαγή της τιμής της μεταβλητής number
απευθείας.
Οι διευθύνσεις μνήμης αντιπροσωπεύουν τις θέσεις όπου αποθηκεύονται οι μεταβλητές σε έναν υπολογιστή. Στη γλώσσα C++, μπορούμε να ανακτήσουμε τη διεύθυνση μνήμης μιας μεταβλητής χρησιμοποιώντας τον τελεστή &.
Όταν μια μεταβλητή δημιουργείται, της αντιστοιχεί μια μοναδική διεύθυνση μνήμης. Κατά την ανάθεση τιμής σε αυτήν τη μεταβλητή, η τιμή αποθηκεύεται στη διεύθυνση μνήμης που της αντιστοιχεί.
Για να ανακτήσουμε τη διεύθυνση μνήμης μιας μεταβλητής, χρησιμοποιούμε τον τελεστή & και το αποτέλεσμα είναι η διεύθυνση μνήμης όπου η μεταβλητή αποθηκεύεται. Με αυτόν τον τρόπο, μπορούμε να αναφερθούμε στη μεταβλητή απευθείας μέσω της διεύθυνσης μνήμης της.
Ας υποθέσουμε ότι έχουμε την ακόλουθη μεταβλητή στη γλώσσα C++:
int number = 42;
Για να ανακτήσουμε τη διεύθυνση μνήμης της μεταβλητής “number”, μπορούμε να χρησιμοποιήσουμε τον τελεστή “&” ως εξής:
int* ptr = &number;
Η μεταβλητή “ptr” είναι ένας δείκτης που δείχνει στη διεύθυνση μνήμης της μεταβλητής “number”. Μπορούμε να αναφερθούμε στην τιμή της μεταβλητής “number” απευθείας χρησιμοποιώντας τον δείκτη “ptr”:
std::cout << "Η τιμή της μεταβλητής number: " << *ptr << std::endl;
Στο παραπάνω παράδειγμα, ο τελεστής “*” χρησιμοποιείται για να αναφερθούμε στην τιμή που αποθηκεύεται στη διεύθυνση μνήμης που δείχνει ο δείκτης “ptr”.
Μπορείτε επίσης να δημιουργήσετε αναφορά σε μια μεταβλητή που δεν έχει αρχικοποιηθεί ακόμη:
#include <iostream> using namespace std; int main() { int myNum; // Δήλωση μιας μεταβλητής ακέραιου τύπου με όνομα myNum int *myPointer = &myNum; // Δήλωση ενός δείκτη ακεραίου τύπου που δείχνει στη μεταβλητή myNum cout << &myNum << endl; // Εκτύπωση της διεύθυνσης μνήμης της μεταβλητής myNum cout << myPointer << endl; // Εκτύπωση της τιμής του δείκτη myPointer return 0; }
Ο παραπάνω κώδικας δημιουργεί μια μεταβλητή myNum
τύπου int
και έναν δείκτη myPointer
τύπου int *
. Στη συνέχεια, εκτυπώνει τη διεύθυνση μνήμης της μεταβλητής myNum
και την τιμή του δείκτη myPointer
.
Οι εντολές cout << &myNum << endl;
και cout << myPointer << endl;
χρησιμοποιούν το αντικείμενο cout
για να εκτυπώσουν τις τιμές. Η &myNum
επιστρέφει τη διεύθυνση μνήμης της μεταβλητής myNum
, ενώ η myPointer
εκτυπώνει την τιμή του δείκτη myPointer
.
Όταν ο κώδικας εκτελεστεί, θα εμφανιστούν οι διευθύνσεις μνήμης της μεταβλητής myNum
και η τιμή του δείκτη myPointer
στην οθόνη.