ProgrammatieC++ ontwikkelaar

Hoe werkt de standaardconstructor in C++? Wat gebeurt er als er geen enkele constructor in de klasse is gedeclareerd, en wat als er expliciet andere constructors zijn gedeclareerd, maar de standaardconstructor niet?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In C++ is een standaardconstructor een constructor zonder parameters of met parameters waarvan allemaal standaardwaarden zijn opgegeven. Als er geen enkele constructor in de klasse is gedeclareerd, genereert de compiler automatisch een public standaardconstructor. Echter, als er ten minste één andere constructor is gedeclareerd (bijvoorbeeld een constructor met parameters), zal de automatisch door de compiler aangeboden standaardconstructor al niet meer worden gegenereerd. Als in zo'n klasse een standaardconstructor nodig is, moet deze expliciet worden gedeclareerd (bijvoorbeeld met ClassName() = default;).

Voorbeeldcode

class Foo { public: Foo(int x) {} // Gebruikersgedefinieerde constructor // Foo() standaardconstructor wordt al niet meer door de compiler gegenereerd! }; Foo f; // Compilatiefout - er is geen standaardconstructor!

Om in dit geval expliciet een standaardconstructor te creëren, moet worden toegevoegd:

class Foo { public: Foo() = default; Foo(int x) {} };

Vraag met een valstrik

«Als je alleen één constructor met parameters hebt, kun je dan objecten van deze klasse zonder parameters maken? Waarom?»

Antwoord: Nee! Omdat als er elke constructor is gedeclareerd, de compiler automatisch de standaardconstructor niet toevoegt. Voor het maken van objecten zonder parameters moet een standaardconstructor expliciet aan de declaratie worden toegevoegd.


Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp.


Verhaal

In een groot project werd een hiërarchie van klassen geschreven voor het serialiseren van gegevens, waar alle "kind"-klassen alleen een specifieke constructor met parameters hadden. Na refactoring bleek dat bij het gebruik van STL-containers (bijvoorbeeld std::vector) met deze klassen de compilatie faalde: de container had een standaardconstructor nodig die er niet was. Het probleem werd pas opgelost na expliciete verklaring van de standaardconstructor.


Verhaal

In een project dat template-programmering gebruikte, had een van de adapterklassen alleen een constructor met parameters om middelen door te geven. Een van de bibliotheken vereiste echter een standaardconstructor voor correcte werking (door tijdelijke objecten te maken via template-typen). Er deden zich mysterieuze linkfouten voor die lange tijd niet konden worden verklaard, totdat we een expliciete standaardconstructor implementeerden.


Verhaal

In de code was er migratie van C++98 naar C++11, en de poging om "= default" te gebruiken voor het expliciet declareren van de standaardconstructor. Bij oude compilers ontstonden fouten of negeerden nieuwe syntactische constructies. Dit onthulde dat niet alle ontwikkelaars het verschil begrepen tussen een expliciet geïmplementeerde standaardconstructor, een door de compiler gegenereerde, en de nieuwe syntaxis "= default".