De indextoegang operator operator[] is een overloadbare operator in C++ die indexering van objecten van aangepaste containers (bijvoorbeeld zoals arrays) mogelijk maakt.
Achtergrond:
In de C-taal, en later in C++, stelde de operator [] gebruikers in staat om snel en gemakkelijk naar elementen in een array te verwijzen met een index. Met de groeiende populariteit van containerklassen ontstond de behoefte om dezelfde syntaxis naar gebruikerstypen te verplaatsen.
Probleem:
Het correct ontwerpen van indextoegang operators houdt verband met vragen van constantheid, beveiliging tegen out-of-bounds toegang, het kiezen van de geretourneerde waarde en de garantie van geldigheid van een referentie of pointer.
Oplossing:
In C++ kan je operator[] overbelasten voor klassen om toegang tot elementen per index mogelijk te maken en "gedrag zoals bij een array" te implementeren. Beide versies van de operator moeten worden geïmplementeerd — de normale (voor niet-constante objecten) en de constante (voor constante objecten).
Voorbeeldcode:
class MyArray { int data[10]; public: int& operator[](size_t index) { return data[index]; } const int& operator[](size_t index) const { return data[index]; } }; MyArray arr; arr[3] = 42; // OK const MyArray& const_arr = arr; int val = const_arr[3]; // OK
Belangrijke kenmerken:
.at() in standaardcontainers)Is het verplicht om een referentie terug te geven uit operator[]?
Nee — maar als je een waarde teruggeeft, werkt de syntaxis arr[i] = x; niet (je zult kopiëren in plaats van toewijzen). Om de gebruikelijke semantiek van een container te ondersteunen, worden meestal referenties teruggegeven. Als je een waarde teruggeeft, zul je geen waarde in het element kunnen schrijven:
int operator[](size_t idx); // arr[2] = 10; compileert niet
Moet operator[] de grenzen controleren?
De standaard vereist dit niet. De klassieke operator[] (zoals in std::vector) voert dergelijke controles NIET uit. Voor controles introduceren standaardcontainers een aparte methode .at(), die een uitzondering gooit bij het overschrijden van de indexering.
Kan operator[] een constante methode zijn?
Nee — als je een niet-const referentie teruggeeft. Echter, operator[] moet ook worden overbelast voor constante en niet-constante objecten, zodat de container intuïtief en veilig werkt.
Een jonge ontwikkelaar implementeerde alleen de niet-constante versie van operator[], die waarde teruggeeft. Hierdoor kon de container niet via een const-referentie worden benaderd, en werkte elke poging tot schrijven vreemd — waarden werden niet opgeslagen.
Voordelen:
Nadelen:
In de container MyArray zijn beide versies van operator[] geïmplementeerd, met correcte terugkeer van referenties. Indien nodig is de methode at() met grenscontrole toegevoegd.
Voordelen:
Nadelen: