@kugel- your comment is appropriate for C, but not for C++ (have I mentioned C++ is NOT C).
To repeat my comment from #3175, C may only have minimal declarations in headers, but C++ typically has far more, especially when using generic programming (ie templates), because the body needs to be available when the template is used.
For example Geany `.h` files are 20% of the `.c` files, Scintilla (which does not use templates) `src/*.h` is 30% of `src/*.cxx` but some of the headers in `includes` are also relevant so it would really be more, or one of my projects that uses templates the `*.hpp` files are nearly 50% of the `*.cpp` files.
So for C++ more names come from the associated headers (rather than random general headers) than is the case with C, and as @techee explained above the heuristic moves these names up the list, making it more useful.