约定是其中一个原因--大多数时候,通过有效的抽象,你只关心接口,只想让它看起来很容易。
但这并不是唯一的原因。如果你的项目是在模块中组织的,你很可能不得不在不同的模块中包含一些头文件,并且你希望清除掉include目录中的其他“噪音”文件。
此外,如果您计划重新分发模块,则可能需要隐藏实现细节。所以你只需要提供头文件和二进制文件--从一个文件夹分发头文件会更简单。
还有一个我实际上更喜欢的替代--公有头放在一个单独的文件夹中(这些包含最小的接口--任何实现细节都看不到),而私有头和实现文件是分开的(可能,但不一定,放在单独的文件夹中)。