質問、コメント、および他の回答へのコメントで私が見ている議論は、コンポーネントのテキスト表現に焦点を当てているようです。プレーンテキストの観点からは、ヘッダーを完全に削除することは理にかなっています。
一方、ヘッダーとcppファイルの分離には2番目のレベルがあります。これは、インターフェイスを実装から分離し、そうすることで、実装の詳細をインターフェイスから削除します。
これはさまざまな方法で発生します。最も単純なレベルでは、特定の機能を実装する方法は、コンポーネントのユーザーとは無関係です[*]。多くの場合、実装の詳細として使用される.cppファイルにさらに多くのタイプと関数を含めることができます。さらに、特定の機能を直接実装するか、別のライブラリに依存して実装する場合は、実装の詳細であり、ユーザーに漏れないようにする必要があります。
その分離は、ファイルの分離を自動的に管理するツールに実装するのが簡単な場合とそうでない場合があり、ヘッダーのみのライブラリの使用を好む人は実行できません。
定義に移動する必要がないと主張し、コード全体を確認したい場合、コンポーネントのどの部分がユーザーに知られてはならない詳細であるかを柔軟に判断できることがわかります。多くのIDE(そして、vimでも)には、1つのキーストロークの組み合わせがあり、1つから別のIDEに移動します。IDEでは、関数のシグニチャをリファクタリングし、IDEにヘッダーと実装の両方に変更を適用させることができます(場合によっては用途にも)...
ツールにヘッダーと実装の両方の統一されたビューを提供させる場合、作成しているコードのどの部分がインターフェイスまたは実装の一部であるか、および決定をツールに認識させるのはおそらくはるかに困難です。ツールが生成されたプログラムに影響を与える可能性があること。
個別のコンパイルモデルには短所だけでなく長所もあります。ここで行われている議論は、より深い設計上の決定のほんの一部に過ぎないと感じています。
[*]各クラスには独自のヘッダーと.cppファイルが必要だと考える人はかなりいるようですが、私は同意しません。各ヘッダーは、単一のクラス、または複数のクラスと無料の関数の分離である可能性のあるコンポーネントを表します。ファイル内のコードの一部は設計の一部であり、単一のコンポーネントには、1つ以上のパブリック型と、場合によっては1つ以上の内部型が含まれる場合があります。