Tutti i nomi nella libreria C++ standard sono in minuscolo tranne std::ios_base::Init
. Perchè è questo?Perché "Init" in std :: ios_base :: Init uppercase?
risposta
In uno dei primi draft delle classi iostream si può vedere che ios_base
non era originariamente presente, basic_ios
è stata la classe di base ed è stato responsabile per Init
e gli altri membri che sono stati successivamente separati in ios_base
.
basic_ios
avuto anche (e still has) una funzione init
, e mentre i due nomi non necessariamente devono essere distinte, presumibilmente per cercare di evitare confusione si è deciso di denominare la classe Init
e la funzione init
. Inoltre, senza questa distinzione qualcosa di simile al seguente sarebbe stato necessario quando si utilizza la classe:
struct ios_base
{
struct init{};
void init();
};
ios_base::init i1; // error
struct ios_base::init i2; // ok
L'idea di avere una classe separata responsabile dell'inizializzazione dei flussi standard risale almeno Cfront 3.0, come si può vedere per Iostream_init
nell'intestazione this. Ad un certo punto è stato deciso non solo di rendere la classe un membro di ios
/basic_ios
/ios_base
ma che dovrebbe essere rinominata Init
.
In ogni caso ha senso disambiguare i due, anche considerando il fatto che alla fine sono stati collocati in classi separate. Avrebbero potuto invece scegliere nomi completamente separati, ma presumibilmente Init
/init
è stata considerata la migliore scelta semantica per descrivere cosa fanno la classe e la funzione, e c'è anche la possibilità che si limitasse a imitare il vecchio Iostream_init
, che per qualche motivo inizia anche con una maiuscola I
.
"deve" è troppo forte, ma sì, una funzione membro con lo stesso nome della classe membro della classe base causerebbe la nascosta di quella classe membro. – hvd
Hmm ... Ispezionando implementazioni libstdC++ pre-standard, nell'evoluzione che portava allo standard C++ 98, c'era un punto in cui c'era solo una classe 'ios' contenente sia' Init' che 'init'. A quel punto, i diversi nomi erano assolutamente necessari, non solo belli da avere. – hvd
@hvd Ho riformulato la risposta grazie al tuo commento, la distinzione init/init sembra davvero un artefatto di un lontano passato. Vorrei sottolineare che una funzione e una classe con lo stesso nome possono ancora felicemente coesistere nello stesso ambito. – user657267
- 1. std :: :: ios_base mangiava e std :: :: trunc ios_base
- 2. Git: init init nella directory errata
- 3. init init nativo nella cartella corrente
- 4. Java: inizializzazione di più variabili in for init init?
- 5. 'std :: :: ios_base ios_base (const std :: ios_base &)' è errore privata', mentre il sovraccarico operatore << per std :: ostram
- 6. Perché init è una funzione parziale?
- 7. Perché [NSObject respondsToSelector: @selector (init)] restituisce 1?
- 8. $ watch viene attivato direttamente dopo init, perché?
- 9. Sottomenu Git init async
- 10. init and awakeFromNib
- 11. actionscript 3 init()
- 12. Storyboard e personalizzazione init
- 13. È stat init init thread-safe con VC2010?
- 14. Usando `auto = [sé init]` per avvolgere altro `init message`
- 15. Differenza Js angolare tra ng-init e data-ng-init
- 16. Previene re-init in ajax
- 17. Classepologia Cakephp :: init in bootstrap
- 18. mpi multiple init finalizza
- 19. Come annullare hg init?
- 20. Solr RequestHandler init fallimento
- 21. fattoria non init definito
- 22. NSMutableArray -init vs. + arrayWithCapacity:
- 23. initWithFrame: trigger init?
- 24. init function for structs
- 25. obiettivo c init nel protocollo
- 26. Utilizzo di init() nella mappa()
- 27. Perché non puoi nominare una funzione in Go "init"?
- 28. Quando chiamare Python super() .__ init __()?
- 29. 'init()' è deprecato: init() verrà rimosso in Swift 3. Usa `nil`
- 30. Super init vs. parent .__ init__
Direi che è semplicemente perché fa un sacco di importanti operazioni di inizializzazione, manutenzione e pulizia per i flussi di I/O. È unico al riguardo, quindi ha ottenuto una capitale. – IVlad
Compatibilità con le versioni precedenti. –
Poiché le convenzioni di denominazione e, in effetti, i nomi in C++ sono completamente confusi, proprio come erano in C. – EJP