Grazie mille della rispostaI motivi sono principalmente storici in realtà. Dato che il C++ discende dal C ne ha ereditato anche il modello file.h, file.cpp e tutti i motivi addotti sono figli di questo modello.
Nella community C++ sono tanti ad essere infastiditi da questo modello arcaico e attualmente il comitato ISOC++ sta lavorando sui modules che dovrebbero semplificare la situazione (qualcosa simil Java), ma prima che siano pienamente supportati ci vorrà qualche anno.
Dipende. Se stai lavorando su una classe template sei obbligato ad avere dichiarazioni e definizioni in un unico file .h.
Se la classe non è un template e ha pochi ( < 4 o 5) metodi con poco codice dentro, può essere conveniente mettere tutto nel corpo della classe o appena sotto la dichiarazione ponendo i metodi inline.
Se la classe è grossa, c'è il rischio che il codice finale sia molto più grosso di quello che si pensi (il bloatware insomma).
Per cui in C++ non è abbietto, ma poco pratico.
Per farti l'esempio opposto, quando ho studiato Java mi sono sempre chiesto perché sono obbligato a definire i metodi dentro le classi, impedendo di avere una dichiarazione di classe pulita e i metodi implementati in maniera altrettanto pulita appena dopo la dichiarazione di classe.