Przyjęta odpowiedź wyjaśnia to w przypadku wirtualnych funkcji prywatnych, ale to odpowiada tylko na jeden konkretny aspekt pytania, który jest znacznie bardziej ograniczony niż to, o co pytał PO. Tak więc musimy przeformułować: Dlaczego musimy zadeklarować nie-wirtualne funkcje prywatne w nagłówkach?
Inna odpowiedź przywołuje fakt, że klasy muszą być zadeklarowane w jednym bloku - po czym są zapieczętowane i nie można do nich dodawać. To właśnie robisz, pomijając deklarację prywatnej metody w nagłówku, a następnie próbując zdefiniować ją gdzie indziej. Niezły punkt. Dlaczego niektórzy użytkownicy tej klasy powinni mieć możliwość rozszerzenia tego w sposób, którego inni użytkownicy nie mogą zaobserwować? Metody prywatne są jego częścią i nie są z tego wyłączone. Ale pytasz, dlaczego są uwzględnione, i wydaje się to trochę tautologiczne. Dlaczego użytkownicy klas muszą o nich wiedzieć? Gdyby nie były widoczne, użytkownicy nie mogliby ich dodać i hej presto.
Chciałem więc udzielić odpowiedzi, która zamiast domyślnie uwzględniać metody prywatne, zapewnia określone punkty na korzyść ich widoczności dla użytkowników. Mechanistyczny powód nie-wirtualnych funkcji prywatnych wymagających publicznej deklaracji podano w GotW # 100 Herb Suttera na temat idiomu Pimpl w ramach jego uzasadnienia. Nie będę tu mówił o Pimplu, bo jestem pewien, że wszyscy o tym wiemy. Ale oto odpowiedni fragment:
W C ++, gdy cokolwiek zmienia się w definicji klasy pliku nagłówkowego, wszyscy użytkownicy tej klasy muszą zostać ponownie skompilowani - nawet jeśli jedyną zmianą były prywatne elementy klasy, do których użytkownicy klasy nawet nie mają dostępu. Wynika to z faktu, że model kompilacji C ++ opiera się na włączeniu tekstu, a ponieważ C ++ zakłada, że wywołujący wiedzą dwie główne rzeczy na temat klasy, na które mogą mieć wpływ członkowie prywatni:
- Rozmiar i układ : [członków i funkcji wirtualnych - oczywiste i doskonałe pod względem wydajności, ale nie dlatego, dlaczego tu jesteśmy]
- Funkcje : Kod wywołujący musi być w stanie rozstrzygać wywołania funkcji członka klasy, w tym niedostępnych funkcji prywatnych, które przeciążają się funkcjami nieprywatnymi - jeśli funkcja prywatna lepiej pasuje, kod wywołujący nie będzie mógł się skompilować. (C ++ podjął świadomą decyzję projektową, aby wykonać rozwiązanie problemu przeciążenia przed sprawdzeniem dostępności ze względów bezpieczeństwa. Na przykład uważano, że zmiana dostępności funkcji z prywatnej na publiczną nie powinna zmieniać znaczenia legalnego kodu wywołującego).
Sutter jest oczywiście niezwykle wiarygodnym źródłem jako członek Komitetu, więc zna „świadomą decyzję projektową”, kiedy ją widzi. Pomysł wymagający publicznego zadeklarowania prywatnych metod jako sposobu uniknięcia późniejszej zmienionej semantyki lub przypadkowo uszkodzonej dostępności jest prawdopodobnie najbardziej przekonującym uzasadnieniem. Na szczęście, ponieważ cała ta sprawa wydawała się wcześniej bezcelowa!