Some people consider header files an advantage:
- It is claimed that it enables/enforces/allows separation of interface and implementation — but usually, this is not the case. Header files are full of implementation details (for example member variables of a class have to be specified in the header, even though they’re not part of the public interface), and functions can, and often are, defined inline in the class declaration in the header, again destroying this separation.
- It is sometimes said to improve compile-time because each translation unit can be processed independently. And yet C++ is probably the slowest language in existence when it comes to compile-times. A part of the reason is the many many repeated inclusions of the same header. A large number of headers are included by multiple translation units, requiring them to be parsed multiple times.
Ultimately, the header system is an artifact from the 70’s when C was designed. Back then, computers had very little memory, and keeping the entire module in memory just wasn’t an option. A compiler had to start reading the file at the top, and then proceed linearly through the source code. The header mechanism enables this. The compiler doesn’t have to consider other translation units, it just has to read the code from top to bottom.
And C++ retained this system for backwards compatibility.
Today, it makes no sense. It is inefficient, error-prone and overcomplicated. There are far better ways to separate interface and implementation, if that was the goal.
However, one of the proposals for C++0x was to add a proper module system, allowing code to be compiled similar to .NET or Java, into larger modules, all in one go and without headers. This proposal didn’t make the cut in C++0x, but I believe it’s still in the “we’d love to do this later” category. Perhaps in a TR2 or similar.