Die akzeptierte Antwort erklärt dies für virtuelle private Funktionen, aber das beantwortet nur eine bestimmte Facette der Frage, die wesentlich begrenzter ist als die, die das OP gestellt hat. Wir müssen also umformulieren: Warum müssen wir nicht-virtuelle private Funktionen in Headern deklarieren ?
Eine andere Antwort ruft die Tatsache hervor, dass Klassen in einem Block deklariert werden müssen - danach sind sie versiegelt und können nicht hinzugefügt werden. Das ist, was Sie tun würden, indem Sie weglassen, eine private Methode im Header zu deklarieren, und dann versuchen, sie an anderer Stelle zu definieren. Schöner Punkt. Warum sollten einige Benutzer der Klasse in der Lage sein, sie auf eine Weise zu erweitern, die andere Benutzer nicht beobachten können? Private Methoden gehören dazu und sind nicht davon ausgeschlossen. Aber dann fragst du, warum sie enthalten sind, und es scheint ein bisschen tautologisch. Warum müssen Klassenbenutzer über sie Bescheid wissen? Wenn sie nicht sichtbar wären, könnten Benutzer keine hinzufügen, und hey presto.
Daher wollte ich eine Antwort geben, die nicht nur private Methoden standardmäßig einbezieht, sondern bestimmte Punkte für die Sichtbarkeit für Benutzer vorsieht. Ein mechanistischer Grund für nicht-virtuelle private Funktionen, die eine öffentliche Erklärung erfordern, wird in Herb Sutters GotW # 100 über die Pimpl-Redewendung als Teil seiner Begründung angegeben. Ich werde hier nicht weiter auf Pimpl eingehen, da wir alle sicher davon wissen. Aber hier ist der relevante Punkt:
In C ++ müssen alle Benutzer dieser Klasse neu kompiliert werden, wenn sich etwas in der Klassendefinition einer Headerdatei ändert. Dies gilt auch dann, wenn nur die privaten Klassenmitglieder geändert wurden, auf die die Benutzer der Klasse nicht einmal zugreifen können. Dies liegt daran, dass das Build-Modell von C ++ auf der Einbeziehung von Text basiert und C ++ davon ausgeht, dass Aufrufer zwei wichtige Dinge über eine Klasse wissen, die von privaten Mitgliedern beeinflusst werden können:
- Größe und Layout : [von Mitgliedern und virtuellen Funktionen - selbsterklärend und großartig für die Leistung, aber nicht, warum wir hier sind]
- Funktionen : Der aufrufende Code muss in der Lage sein, Aufrufe an Mitgliedsfunktionen der Klasse aufzulösen, einschließlich nicht zugreifbarer privater Funktionen, die mit nicht privaten Funktionen überladen sind. Wenn die private Funktion besser übereinstimmt, kann der aufrufende Code nicht kompiliert werden. (C ++ entschied sich aus Sicherheitsgründen absichtlich für die Überlastungslösung, bevor die Barrierefreiheit überprüft wurde. Beispielsweise wurde die Ansicht vertreten, dass die Änderung der Barrierefreiheit einer Funktion von privat zu öffentlich die Bedeutung des legalen Aufrufcodes nicht ändern sollte.)
Sutter ist natürlich eine äußerst zuverlässige Quelle als Mitglied des Komitees, daher kennt er "eine bewusste Entwurfsentscheidung", wenn er eine sieht. Und die Idee, eine öffentliche Deklaration privater Methoden zu fordern, um eine veränderte Semantik oder eine versehentlich unterbrochene Zugänglichkeit später zu vermeiden, ist wahrscheinlich die überzeugendste Begründung. Zum Glück, denn das Ganze schien bisher ziemlich sinnlos zu sein!