ProgrammatieC++ Middel/ Senior ontwikkelaar

Vertel hoe de volgorde van initialisatie van dataleden in de initialisatie-lijst van de constructor werkt. Hoe verschilt dit van de volgorde van hun verklaring in de klasse? Waarom is dit belangrijk?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

In C++ vindt de volgorde van initialisatie van de leden van de klasse altijd in de volgorde waarin ze zijn verklaard in het lichaam van de klasse plaats, en niet in de volgorde waarin ze in de initialisatie-lijst van de constructor zijn opgegeven.

Voorbeeld:

struct Foo { int a; int b; Foo() : b(2), a(b) {} };

In dit voorbeeld zal a eerst worden geïnitialiseerd met de waarde van de ongeïnitieerde variabele b, omdat a eerst wordt geïnitialiseerd, gevolgd door b, ongeacht de volgorde in de initialisatie-lijst. Uiteindelijk zal a niet gelijk zijn aan 2.

De juiste manier is om bij initialisatie alleen te verwijzen naar leden die eerder zijn verklaard of om constanten te gebruiken.

Strikvraag.

In welke volgorde worden de leden van de klasse geïnitialiseerd als in de initialisatie-lijst van de constructor de volgorde van initialisatie anders is dan in de verklaring?

Antwoord: Altijd wordt het lid dat als eerste in de klasse is verklaard als eerste geïnitialiseerd, ongeacht de volgorde in de initialisatie-lijst van de constructor. Dit kan leiden tot fouten bij wederzijdse afhankelijkheid van de leden van de klasse.

Voorbeelden van echte fouten door gebrek aan kennis van de subtiliteiten van het onderwerp.


Verhaal

In een complexe klasse werd bij het initialiseren van een verwijzing naar een lid een ander lid niet geïnitialiseerd. Het bleek dat de volgorde in de initialisatie-lijst geen rol speelde, en er werd gebruikgemaakt van niet-geinitialiseerd geheugen. De software viel alleen op bij bepaalde compilers en instellingen.


Verhaal

Bij het toevoegen van een nieuw lid in het midden van de klasse zonder de volgorde van initialisatie van afhankelijke leden aan te passen, ontstond een fout die alleen werd ontdekt tijdens statische code-analyse. De variabele kreeg een ongeldige waarde vanwege de oude volgorde van verklaring.


Verhaal

Een nieuwe versie van de bibliotheek wijzigde de oorspronkelijke code van de klasse en veranderde de volgorde van de leden, zonder de constructor te wijzigen. Als gevolg daarvan werkte Values in de applicatie met ongeldige gegevens: de ingenieur kon de oorzaak lange tijd niet begrijpen, totdat hij de waarschuwing van de compiler over de volgorde van initialisatie zag.