Kursinhalt
C++ Smart Pointers
C++ Smart Pointers
Wie Unterscheiden Sich Referenzen von Pointern?
Verständnis von Referenzen
Im ersten Abschnitt haben wir gesehen, dass Referenzen Aliase für bestehende Variablen sind. Das Hauptziel von Referenzen ist es, eine alternative Syntax für den Zugriff auf den Wert eines Objekts bereitzustellen. Wenn wir unter die Haube schauen, ist die Speicheradresse einer Referenz dieselbe wie die Speicheradresse des referenzierten Objekts.
main
#include <iostream> int main() { int num = 42; int& refNum = num; // Output memory addresses std::cout << "Address of num: " << &num << std::endl; std::cout << "Address of refNum: " << &refNum << std::endl; // Output values std::cout << "Value of num: " << num << std::endl; std::cout << "Value of refNum: " << refNum << std::endl; }
Wenn Sie den obigen Code ausführen, werden Sie sehen, dass sowohl die Variable num
als auch die Referenz refNum
die gleichen Werte und die gleichen Speicheradressen haben.
Eine Referenz ist im Wesentlichen ein konstanter Zeiger
Eine andere Möglichkeit, darüber nachzudenken, ist, dass eine Referenz im Wesentlichen ein konstanter Zeiger ist. Ein konstanter Zeiger ist ein Zeiger, der nach der Initialisierung nicht auf ein anderes dynamisches Objekt umgeleitet werden kann. Ein konstanter Zeiger muss jedoch dereferenziert werden, um den Wert des dynamischen Objekts zu erhalten. Bei Referenzen müssen Sie nicht dereferenzieren, da Sie direkt auf den Wert zugreifen können. Betrachten wir ein Beispiel für mehr Klarheit:
main
#include <iostream> int main() { // Example with a reference int num1 = 42; int& refNum = num1; // Example with a constant pointer int num2 = 73; int* const ptrNum = &num2; // Attempting to reassign the reference or constant pointer will result in a compilation error // refNum = num2; // Uncommenting this line will just set num1 value to num2 value // ptrNum = &num1; // Uncommenting this line will cause a compilation error // Output values directly through reference and with dereferencing constant pointer std::cout << "Value of num1 through refNum: " << refNum << std::endl; std::cout << "Value of num2 through ptrNum: " << *ptrNum << std::endl; }
Im obigen Code demonstrieren wir viele Dinge. Zuerst erstellen wir einen konstanten Zeiger und eine Referenz. Dann zeigen wir, dass keiner von beiden neu zugewiesen werden kann. Schließlich drucken wir ihre Werte: Für den konstanten Zeiger müssen wir *
zum Dereferenzieren verwenden, aber die Referenz kann direkt zugegriffen werden. Experimentieren Sie mit dem Code, um mehr zu lernen, während Sie den Kommentaren folgen!
Auf NULL setzen | Kann auf NULL gesetzt werden | Kann nicht auf NULL gesetzt werden |
Adresse im Speicher | Hat eine eigene Adresse im Speicher | Hat keine eigene Adresse im Speicher |
Initialisierung | Kann nicht initialisiert bleiben | Muss initialisiert werden oder verursacht einen Compilerfehler |
Zeiger auf einen anderen Zeiger | Möglich | Nicht möglich |
Array-Erstellung | Array von Zeigern kann erstellt werden | Array von Referenzen kann nicht erstellt werden |
Zugriff auf Klassen-/Strukturmitglieder | Verwenden Sie -> , um auf Mitglieder zuzugreifen | Verwenden Sie . , um auf Mitglieder zuzugreifen |
Danke für Ihr Feedback!