Wydaje się, że pytasz o oddzielenie definicji od deklaracji, chociaż istnieją inne zastosowania plików nagłówkowych.
Odpowiedź jest taka, że C ++ nie „potrzebuje” tego. Jeśli oznaczysz wszystko w linii (co i tak jest automatyczne dla funkcji składowych zdefiniowanych w definicji klasy), nie ma potrzeby separacji. Możesz po prostu zdefiniować wszystko w plikach nagłówkowych.
Powody, dla których warto się rozdzielić, to:
- Aby poprawić czas budowy.
- Łączenie z kodem bez posiadania źródła definicji.
- Aby uniknąć oznaczania wszystkiego „w tekście”.
Jeśli twoje bardziej ogólne pytanie brzmi „dlaczego C ++ nie jest identyczne z Javą?”, To muszę zapytać „dlaczego piszesz C ++ zamiast Javy?” ;-p
Ale poważniej, powodem jest to, że kompilator C ++ nie może po prostu sięgnąć do innej jednostki tłumaczeniowej i dowiedzieć się, jak używać jej symboli w sposób, w jaki może to robić i robi javac. Plik nagłówkowy jest potrzebny do zadeklarowania kompilatorowi tego, czego może się spodziewać w czasie łączenia.
Podobnie #include
jest z prostą substytucją tekstową. Jeśli zdefiniujesz wszystko w plikach nagłówkowych, preprocesor w końcu utworzy ogromną kopię i wklej każdy plik źródłowy w twoim projekcie i przekaże to do kompilatora. Fakt, że standard C ++ został ratyfikowany w 1998 roku, nie ma z tym nic wspólnego, to fakt, że środowisko kompilacji dla C ++ jest tak blisko oparte na środowisku C.
Przekształcam moje komentarze, aby odpowiedzieć na pytanie uzupełniające:
W jaki sposób kompilator znajduje plik .cpp z zawartym w nim kodem
Tak nie jest, przynajmniej nie w momencie kompilacji kodu używającego pliku nagłówkowego. Funkcje, z którymi się łączysz, nie muszą być jeszcze napisane, nieważne, że kompilator wie, w jakim .cpp
pliku będą się znajdować. Wszystko, co kod wywołujący musi wiedzieć w czasie kompilacji, jest wyrażone w deklaracji funkcji. W momencie łączenia dostarczysz listę .o
plików lub bibliotek statycznych lub dynamicznych, a nagłówek w efekcie jest obietnicą, że definicje funkcji będą gdzieś tam.