ProgrammazioneSviluppatore C++

Come funziona il costruttore di default in C++? Cosa succede se non viene dichiarato alcun costruttore in una classe e se vengono dichiarati esplicitamente altri costruttori, ma non il costruttore di default?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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;).

Esempio di codice

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) {} };

Domanda trabocchetto

«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.


Esempi di errori reali a causa della mancanza di conoscenza delle sfumature dell'argomento.


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".