La risposta accettata spiega questo per le funzioni private virtuali , ma risponde solo a un aspetto specifico della domanda, che è considerevolmente più limitato di quello che l'OP ha chiesto. Quindi, dobbiamo riformulare: perché siamo tenuti a dichiarare le funzioni private non virtuali nelle intestazioni?
Un'altra risposta invoca il fatto che le classi devono essere dichiarate in un blocco, dopo di che sono sigillate e non possono essere aggiunte. Questo è quello che faresti omettendo di dichiarare un metodo privato nell'intestazione e cercando di definirlo altrove. Bel punto. Perché alcuni utenti della classe dovrebbero essere in grado di aumentarlo in modo che altri utenti non possano osservare? I metodi privati ne fanno parte e non ne sono esclusi. Ma poi chiedi perché sono inclusi e sembra un po 'tautologico. Perché gli utenti della classe devono saperlo? Se non fossero visibili, gli utenti non potrebbero aggiungerne nessuno, e hey presto.
Quindi, volevo fornire una risposta che, anziché includere semplicemente i metodi privati per impostazione predefinita, fornisca punti specifici a favore della loro visibilità agli utenti. Un motivo meccanicistico per funzioni private non virtuali che richiedono una dichiarazione pubblica è riportato nel GotW # 100 di Herb Sutter sull'idioma di Pimpl come parte della sua logica. Non parlerò di Pimpl qui, poiché sono sicuro che lo sappiamo tutti. Ma ecco il bit rilevante:
In C ++, quando cambia qualcosa nella definizione della classe di un file di intestazione, tutti gli utenti di quella classe devono essere ricompilati, anche se l'unica modifica è stata ai membri della classe privata a cui gli utenti della classe non possono nemmeno accedere. Questo perché il modello di build di C ++ si basa sull'inclusione testuale e perché C ++ presuppone che i chiamanti conoscano due cose principali su una classe che possono essere influenzate dai membri privati:
- Dimensioni e layout : [dei membri e funzioni virtuali - autoesplicativo e ottimo per le prestazioni, ma non per questo che siamo qui]
- Funzioni : il codice chiamante deve essere in grado di risolvere le chiamate alle funzioni membro della classe, comprese le funzioni private inaccessibili che si sovraccaricano di funzioni non private - se la funzione privata è una corrispondenza migliore, il codice chiamante non verrà compilato. (Il C ++ ha preso la deliberata decisione di progettazione per eseguire la risoluzione del sovraccarico prima del controllo dell'accessibilità per motivi di sicurezza. Ad esempio, si è ritenuto che cambiare l'accessibilità di una funzione da privato a pubblico non dovrebbe cambiare il significato del codice di chiamata legale.)
Sutter è, ovviamente, una fonte estremamente affidabile come membro del Comitato, quindi conosce "una decisione progettuale deliberata" quando ne vede una. E l'idea di richiedere una dichiarazione pubblica dei metodi privati come un modo per evitare la semantica alterata o l'accessibilità accidentale rotta in seguito è probabilmente la logica più convincente. Per fortuna, dato che il tutto sembrava piuttosto inutile prima d'ora!