Ich habe das Buch zwar nicht gelesen, aber ich hoffe ich kann es dir trotzdem kurz erklären.
In der Header-Datei beschreibst du, was alles zur Verfügung steht. Also Funktionen, Klassen, Enumerationen, Templates, usw. Der Name der Funktion, die Namen der Parameter und ein kleiner Kommentar geben an, was die Funktion, Klasse etc. tun. Wie genau sie das tun, ist für den Header uninteressant.
Im Sourcecode steht dann, wie genau die Funktion das macht, was im Header beschrieben steht.
Man verwendet verschiedene Header- und Source-Dateien, um verschiedene Funktionen in einem Programm / einer Library inhaltlich von einander zu trennen. So hat man nicht endlos große Dateien, alles für die Übersicht.
Die Sourcedateien inkludieren die Header und sagen damit dem Compiler, was sie für Funktionen brauchen. Der Compiler kompiliert dann jede Source-Datei einzeln und hinterlässt einen "Verweis" auf Funktionen, die er nur durch den Prototyp kennt. Danach kommt der Linker zum Einsatz. Er "bastelt" aus allem, was kompiliert ist, das Programm zusammen. Die "Verweise" werden dann miteinander verknüpft.
Das ganze passiert mit der richtigen IDE automatisch. Ansonsten muss jede Cpp-Datei kompiliert und zusammen an den Linker übergeben werden. Eine IDE macht das automatisch.
Die Prototypen werden vorher erzeugt, um den Compiler zu sagen, was das überhaupt ist. Ein Funktion namens "IrgendwasFunktion" kann doch auch eine Variable, oder eine Konstante sein. Der Compiler muss immer vorher wissen, was gemeint ist.
Prototypen vor der main-Funktion hat man eigentlich nur bei Ein-Datei-Programmen. Normalerweise werden die Prototypen in separate Header geschrieben und die genaue Definition der Funktionen in separate Source-Dateien. Per Include im Source stellt man dem Compiler alle Funktionen vor und der Linker fügt alle zusammen.