In de vroege versies van C++ werden lidvelden van een klasse geïnitialiseerd binnen de constructor door middel van toewijzing. Later kwam de mogelijkheid om lidvelden van een klasse te initialiseren vóór de binnenkomst in de constructor door middel van een initializer list, wat kritiek belangrijk is voor constante leden, referenties en prestaties.
Sommige leden van een klasse (bijvoorbeeld const-velden of referenties) kunnen niet worden geïnitialiseerd door toewijzing binnen het lichaam van de constructor — ze moeten worden ingesteld op het moment van creatie. Bovendien, als je toewijzing gebruikt, wordt eerst de default-constructor aangeroepen, en dan de toewijzing (twee acties), wat duur kan zijn voor complexe objecten:
class Example { const int x; std::string str; public: Example(int val, const std::string& s) : x(val), str(s) {} };
Gebruik de initializer list om leden van de klasse onmiddellijk te initialiseren. Dit is vooral belangrijk voor const, referenties, lidklassen zonder default constructor, en voor prestaties bij het werken met STL-klassen en grote structuren.
Codevoorbeeld:
class Point { const int x; int& y; public: Point(int val, int& ref) : x(val), y(ref) {} };
Belangrijke kenmerken:
Kan de volgorde van initialisatie van klasseleden worden gewijzigd door de volgorde in de initializer list van de constructor?
Nee! Leden worden altijd geïnitialiseerd in de volgorde van hun declaratie in de klasse, en niet in de volgorde in de initializer list. Het negeren van deze regel leidt tot fouten in de volgorde van initialisatie.
Wat gebeurt er als een referentielid niet is geïnitialiseerd in de initializer list, maar alleen in het lichaam van de constructor?
Compilatiefout! Een referentie, net als const-velden, kan alleen worden geïnitialiseerd in de initializer list — ze moeten een waarde krijgen vóór de binnenkomst in het lichaam van de constructor.
Na de initialisatie van een const-lid in de initializer list kan het worden gewijzigd in het lichaam van de constructor?
Nee, een constant lid kan niet worden gewijzigd na initialisatie — een poging om zo'n veld te wijzigen leidt tot een compilatiefout.
In de constructor wordt het lid van de klasse geïnitialiseerd binnen het lichaam van de constructor. Voor complexe objecten worden middelen verspild aan het aanroepen van de default constructor, vervolgens aan toewijzing, en daarna aan het vernietigen van het tijdelijke object.
Voordelen:
Nadelen:
Alle leden worden meteen geïnitialiseerd in de initializer list, er zijn geen overbodige operaties en problemen met immutabele velden.
Voordelen:
Nadelen: