Ja akurat lubię ten podział na header / cpp. Podział na interfejs i implementacje jest dla mnie wygodny.
Ten podział na interfejs i implementację ma sens dla czystego C, w programowaniu strukturalnym, gdzie programy = struktury danych + algorytmy. Struktury do nagłówków, algorytmy do *.c. Eleganckie, proste i co najważniejsze szybko się kompiluje, bo nagłówki są proste.
Dla C++ używającego ostro szablonów tego sensu nie ma, bo i tak prawie wszystko ląduje w nagłówkach. A one wciągają inne nagłówki. I w typowym projekcie nagle się okazuje, że żeby skompilować 10 linijek cpp, kompilator musi wczytać 10000 linii z nagłówków.
Dla OOP też nie bardzo jest sens, bo część prywatna klasy nie powinna być częścią interfejsu. Zauważ, że w takiej Javie czy C# mogę dowolnie zmieniać zarówno sygnatury jak i treści metod prywatnych i jedyne co wymaga rekompilacji to plik, który zawierał zmienione definicje. Ba, mogę taki pojedynczy plik po skompilowaniu podmienić z poprzednim (binarnym) i kod będzie działał. Bo prywatne jest naprawdę prywatne, a nie "publiczne, ale niedostępne z zewnątrz".
PIMPL - dobrze, że to wyciągnąłeś - to jest właśnie świetny przykład wzorca, który istnieje tylko w C++ i tylko dlatego, aby obejść pewną ułomność języka. Uczenie się tego wzorca nie przyniesie żadnych korzyści jeśli chodzi o naukę programowania ogólnie.
Warto uczyć się C++ bo jest wykorzystywany praktycznie wszędzie - aplikacje biznesowe / desktopowe, urządzenia mobilne, systemy wbudowane.
Aplikacje biznesowe - niemal całkowicie wyparte przez Javę i C#, te które zostały to głównie jakieś legacy z lat 90-tych. Urządzenia mobilne - tylko w bardziej wymagających grach. Systemy wbudowane? C no i faktycznie trochę C++. Tylko ile jest takich firm, które to robią? Zwłaszcza w Polsce?
C++ jest nadal wykorzystywany i długo będzie, ale z tym "praktycznie wszędzie" to byłbym serio ostrożny.