In C++, il costruttore di default è un costruttore senza parametri o con parametri, tutti con valori predefiniti. Se in una classe non viene dichiarato alcun costruttore, il compilatore genera automaticamente un costruttore di default public. Tuttavia, se viene dichiarato almeno un altro costruttore (ad esempio, un costruttore con parametri), il costruttore di default non verrà più generato automaticamente dal compilatore. Se in tale classe è necessario un costruttore di default, deve essere dichiarato esplicitamente (ad esempio, usando ClassName() = default;).
class Foo { public: Foo(int x) {} // Costruttore personalizzato // Foo() di default non sarà generato dal compilatore! }; Foo f; // Errore di compilazione - nessun costruttore di default!
Per creare esplicitamente un costruttore di default in questo caso, è necessario aggiungere:
class Foo { public: Foo() = default; Foo(int x) {} };
«Se hai solo un costruttore con parametri, puoi creare oggetti di questa classe senza parametri? Perché?»
Risposta: No! Perché, se viene dichiarato qualunque costruttore, il compilatore non aggiunge automaticamente il costruttore di default. Per creare oggetti senza parametri è necessario aggiungere esplicitamente il costruttore di default nella dichiarazione.
Storia
In un grande progetto è stata scritta un'ereditarietà di classi per la serializzazione dei dati, dove tutte le classi "figlie" avevano solo costruttori specifici con parametri. Dopo il refactoring, si è scoperto che, utilizzando contenitori STL (ad esempio, std::vector) con queste classi, la compilazione falliva: il contenitore richiedeva un costruttore di default, che non esisteva. Il problema è stato risolto solo dopo aver dichiarato esplicitamente il costruttore di default.
Storia
In un progetto che utilizza la templating, una delle classi adattatore dichiarava solo un costruttore con parametri per il trasferimento di risorse. Tuttavia, una delle librerie richiedeva la presenza di un costruttore di default per un corretto funzionamento (creando oggetti temporanei tramite tipi di modulo). Si verificavano errori di collegamento misteriosi che non si riuscivano a spiegare, finché non è stato implementato esplicitamente il costruttore di default.
Storia
Nel codice si è verificata una migrazione da C++98 a C++11 e il tentativo di utilizzare "= default" per dichiarare esplicitamente il costruttore di default. Su vecchi compilatori si sono verificati errori o nuove costruzioni sintattiche sono state ignorate. Questo ha rivelato che non tutti gli sviluppatori comprendono la differenza tra un costruttore di default esplicitamente implementato, uno generato dal compilatore e la nuova sintassi "= default".