Achtergrond:
Pointers zijn een van de belangrijkste hulpmiddelen in C++ sinds de oprichting van de taal, de basis voor geheugenbeheer en dynamische structuren, evenals interactie met low-level systeembibliotheken. Referenties werden later toegevoegd (met de komst van C++) om de syntaxis te vereenvoudigen en de veiligheid van de code te verhogen.
Probleem:
Fouten bij geheugenbeheer zijn een van de meest voorkomende problemen in C++, vooral bij verkeerd gebruik van pointers (dangle pointers, memory leaks). Soms begrijpt een beginner niet wanneer je een referentie en wanneer je een pointer moet gebruiken of denkt ten onrechte dat ze volledig uitwisselbaar zijn.
Oplossing:
Een pointer (T*) is een variabele die het adres van een object opslaat, kan nullptr zijn, ondersteunt rekenkunde, staat dynamische toewijzing en verwijdering toe, en kan wijzigen waar hij naar wijst.
Een referentie (T&) is een alias voor een ander bestaand object. Referenties moeten bij creatie geïnitialiseerd worden, kunnen niet "leeg" zijn (verwijzen naar null), ondersteunen geen rekenkunde, maar zijn handiger en veiliger (bijvoorbeeld bij het doorgeven aan functies).
Codevoorbeeld:
void increment_pointer(int* p) { if(p) ++(*p); } void increment_reference(int& r) { ++r; } int main() { int a = 5; increment_pointer(&a); increment_reference(a); }
Belangrijke kenmerken:
nullptr zijn.Kan ik een referentie wijzigen nadat deze is geïnitialiseerd, zodat deze naar een ander object verwijst?
Nee. Een referentie in C++ is een constante alias. Na initialisatie zal de referentie altijd naar hetzelfde object verwijzen, in tegenstelling tot een pointer die kan worden omgeleid.
Codevoorbeeld:
int a = 1; int b = 2; int& ref = a; // ref = b - wijst b waarde toe, maar ref blijft naar a verwijzen
Kun je een "nul" referentie of een referentie naar nullptr maken?
Nee, de standaard staat geen referenties naar niet-bestaande objecten toe. Dit leidt tot ongedefinieerd gedrag.
Voorbeeld:
int* p = nullptr; // int& r = *p; - UB
Wat is het verschil tussen int const ptr en const int ptr?**
int* const ptr is een constante pointer naar int (de pointer kan niet worden omgeleid, maar de waarde kan worden gewijzigd). const int* ptr is een pointer naar een constante int (de inhoud waarop hij wijst kan niet worden gewijzigd, maar de pointer kan worden omgeleid).
Codevoorbeeld:
int a = 1, b = 2; const int* ptr1 = &a; // *ptr1 kan niet worden gewijzigd, ptr1 = &b - kan int* const ptr2 = &a; // *ptr2 kan worden gewijzigd, ptr2 = &b - kan niet
Een jonge ontwikkelaar gebruikte pointers voor het doorgeven van parameters, controleerde ze niet op nullptr, en kreeg crashe bij fouten.
Voordelen:
Nadelen:
Een ervaren ontwikkelaar gebruikte int& wanneer de overdracht gegarandeerd was, en int* wanneer nullptr mogelijk was, terwijl hij de pointer altijd op null controleerde.
Voordelen:
Nadelen: