Modificare. In realtà, mentre quello che dico nella mia prima risposta è valido, questo è il vero motivo .:
All'inizio c'era C. C non orientato agli oggetti (puoi adottare un approccio OO, ma non ti aiuta né impone nulla).
Poi c'era C With Classes, che in seguito fu ribattezzato C ++. Il C ++ è orientato agli oggetti e quindi incoraggia l'incapsulamento e garantisce l'invarianza di un oggetto: al momento della costruzione e all'inizio e alla fine di qualsiasi metodo, l'oggetto si trova in uno stato valido.
La cosa naturale a che fare con questo, è far rispettare che una classe deve sempre avere un costruttore per assicurarsi che inizi in uno stato valido - se il costruttore non deve fare nulla per garantire ciò, allora il costruttore vuoto documenterà questo fatto .
Ma un obiettivo con C ++ era di essere compatibile con C al punto che, per quanto possibile, tutti i programmi C validi erano anche programmi C ++ validi (non più un obiettivo attivo e l'evoluzione di C separata da C ++ significa che non vale più ).
Un effetto di questo è stata la duplicazione delle funzionalità tra struct
e class
. Il primo fa le cose in modo C (tutto pubblico per impostazione predefinita) e il secondo fa le cose in modo OO (tutto è privato per impostazione predefinita, lo sviluppatore rende attivamente pubblico ciò che desidera).
Un altro è che per un C struct
, che non può avere un costruttore perché C non ha costruttori, sia valido in C ++, allora deve esserci un significato per questo nel modo di guardarlo in C ++. E così, pur non avendo un costruttore sarebbe contrario alla pratica OO di assicurare attivamente un invariante, C ++ ha preso questo per significare che c'era un costruttore senza parametri predefinito che si comportava come se avesse un corpo vuoto.
Tutti i C structs
erano ora C ++ validi structs
(il che significava che erano gli stessi del C ++ classes
con tutto - membri ed eredità - pubblici) trattati dall'esterno come se avesse un unico costruttore senza parametri.
Se tuttavia hai inserito un costruttore in un class
o struct
, allora stai facendo le cose nel modo C ++ / OO piuttosto che nel modo C, e non c'era bisogno di un costruttore predefinito.
Dal momento che fungeva da scorciatoia, le persone continuavano a usarlo anche quando la compatibilità non era possibile altrimenti (usava altre funzionalità C ++ non in C).
Quindi quando è arrivato Java (basato su C ++ in molti modi) e successivamente C # (basato su C ++ e Java in diversi modi), hanno mantenuto questo approccio come qualcosa a cui i programmatori potrebbero già essere abituati.
Stroustrup ne parla nel suo linguaggio di programmazione The C ++ e ancora di più, con una maggiore attenzione ai "perché" del linguaggio in The Design and Evolution of C ++ .
=== Risposta originale ===
Diciamo che non è successo.
Diciamo che non voglio un costruttore senza parametri, perché non posso mettere la mia classe in uno stato significativo senza uno. In effetti, questo è qualcosa che può accadere con struct
C # (ma se non puoi fare un uso significativo di tutti gli zeri e null struct
in C #, nella migliore delle ipotesi stai usando un'ottimizzazione non pubblicamente visibile, e altrimenti hai un difetto di progettazione nell'uso struct
).
Per rendere la mia classe in grado di proteggere i suoi invarianti, ho bisogno di una removeDefaultConstructor
parola chiave speciale . Per lo meno, avrei bisogno di creare un costruttore privato senza parametri per assicurarmi che nessun codice chiamante chiami il default.
Il che complica ancora un po 'la lingua. Meglio non farlo.
In tutto, è meglio non pensare di aggiungere un costruttore come rimozione del default, meglio pensare di non avere alcun costruttore come zucchero sintattico per aggiungere un costruttore senza parametri che non fa nulla.