Geschiedenis van de kwestie:
In de vroege versies van C++ moesten alle klasleden worden geïnitialiseerd in de initializer-lijst van de constructor of in het lichaam van de constructor. Met de komst van C++11 werd het mogelijk om niet-statische klasleden rechtstreeks op de plaats van hun definitie te initialiseren — dit verbeterde de leesbaarheid en verlaagde de kans op fouten met niet-geïnitieerde variabelen aanzienlijk.
Probleem:
Het ontbreken van standaardinitialisatie leidde tot onduidelijk gedrag voor ontwikkelaars, vooral bij de introductie van nieuwe constructeurs. Er was geen garantie dat klasleden altijd waren geïnitialiseerd. De schoonheid en nieuwheid van de aanpak ligt in het verminderen van boilerplate-code.
Oplossing:
Inline-initialisatie stelt een standaardwaarde in voor een klass lid, als deze niet expliciet is geïnitialiseerd in de initializer-lijst van de constructor.
Voorbeeldcode:
class Widget { int value = 42; std::string name{"default"}; public: Widget() {} Widget(int v) : value(v) {} };
Belangrijke kenmerken:
Zal de waarde van inline-initialisatie worden gebruikt als het lid is opgegeven in de initializer-lijst van de constructor?
Nee, de waarde uit de initializer-lijst van de constructor wordt gebruikt. Voorbeeld:
class Test { int a = 10; public: Test(int x) : a(x) {} }; Test t(42); // a == 42
Kan ik statische klasleden inline initialiseren?
Nee, alleen niet-statische leden. Statische klasleden worden apart buiten de klas geïnitialiseerd.
Kan ik expressies gebruiken voor inline-initialisatie van klasleden?
Voor eenvoudige leden — ja (bijvoorbeeld, aanroep van de constructor of literal). Voor complexe berekeningen gebruik je een functie of initialisatie in de constructor.
Het team voegde een nieuwe constructor toe, maar vergat het veld te initialiseren. Dit bleef met een niet-geïnitialiseerde waarde. Er trad een crash op bij toegang tot de variabele.
Voordelen:
Nadelen:
Inline-initialisatie werd toegepast voor alle velden van de klas. In de nieuwe constructors hoefde de initialisatie niet expliciet te worden geschreven, wat het aantal boilerplate-code en fouten verminderde.
Voordelen:
Nadelen: