Achtergrond van de vraag:
De initialisatie lijst is geïntroduceerd in C++ voor optimalisatie en correcte initialisatie van klasseleden vóór de uitvoering van de hoofdconstructor. Dit kwam voort uit de ervaring met C en C++: voor constante leden en referenties kan je ze niet initialiseren in het lichaam van de constructor, alleen in de lijst.
Probleem:
Bij het proberen om dergelijke leden te initialiseren in het lichaam van de constructor in plaats van de initialisatie lijst zal een compilerfout optreden. Bovendien leidt het negeren van de lijst tot een dubbele initialisatie-aanroep voor objectleden, wat de prestaties beïnvloedt, vooral bij complexe initialisatie-constructors.
Oplossing:
Het is optimaal om klasseleden te declareren en te initialiseren via de initialisatie lijst — vooral als het constanten (const) of referenties (&) zijn. De initialisatie lijst wordt ingeschakeld VOOR de uitvoering van het lichaam van de constructor, wanneer de klasseleden nog maar net worden geconstrueerd.
Codevoorbeeld:
class Example { const int value; int& ref; public: Example(int v, int& r) : value(v), ref(r) { /* lichaam van de constructor */ } };
Belangrijke kenmerken:
Wat gebeurt er als de volgorde van klasseleden en hun initialisatie in de lijst verandert?
Initialisatie gaat altijd in de volgorde van declaratie van de leden in de klasse, en niet in de volgorde zoals geschreven in de initialisatie lijst. Als afhankelijke leden in "de verkeerde volgorde" worden geïnitialiseerd, kan er een beroep worden gedaan op nog niet-geïnitialiseerde geheugen.
Codevoorbeeld:
class Foo { int x; int y; Foo() : y(2), x(y) {} // x wordt als EERSTE geïnitialiseerd met de waarde van niet-geïnitialiseerde y }
Kan een const-lid van de klasse worden geïnitialiseerd in het lichaam van de constructor?
Nee. Dit zal een compilerfout veroorzaken. Alleen via de initialisatie lijst.
Wat gebeurt er als een referentielid niet wordt geïnitialiseerd?
Als een referentielid niet wordt geïnitialiseerd, verschijnt er een compilerfout, omdat een referentie "verbonden" moet zijn met een object bij de creatie en later niet kan worden gewijzigd.
In een klasse voor het opslaan van instellingen worden const std::string en referentie gebruikt, de poging om deze leden te initialiseren wordt uitgevoerd in het lichaam van de constructor, de compiler geeft een fout of de gegevens worden niet geïnitialiseerd.
Voordelen: De beginner heeft de fout geleerd, leerde het verschil tussen constructie en toewijzing.
Nadelen: Compilerfout, onmogelijkheid om de klasse te gebruiken, mogelijk onverwachte fouten tijdens het initialiseren van objecten.
Constante en referentie worden correct geïnitialiseerd via de initialisatie lijst. Alle complexe initialisatiecode is geconcentreerd in de lijst, wat de leesbaarheid verhoogt en fouten voorkomt.
Voordelen: Veilige en correcte initialisatie van klasseleden, hoge leesbaarheid, geen lekken of UB.
Nadelen: Er kan een complexe initialisatielogica ontstaan die niet eenvoudig te testen is zonder extra code.