1) L'include serve a importare le definizioni di classi/metodi/dati/... il file .cpp contiene invece l'implementazione. Potresti, volendo, non utilizzare alcun file .h e solo file .cpp, certo ne risulterebbe un codice mal organizzato e bug-prone.

2) Il .h e solo una rappresentazione formale dei tipi di dato e prototipi di funzione, per compilare la classe non devi fare altro che compilare la classe

1 the return) Anche se si può fare, è scorretto includere un file .cpp, infatti al compilatore per controllare la correttezza formale del codice bastano le definizioni dei tipi di dato e dei tipi di dati utilizzati dalle funzione, l'implementazione della funzione è "gestita a parte" e poi il compilato viene "unito" dal linker che crea l'eseguibile.
Insomma per un controllo di correttezza non è necessaria l'implementazione e quindi bastano i prototipi importati includendo il file .h.